JavaScript:如何筛选arr1保留与arr2有相同age键值的对象?
解决数组过滤匹配age的问题
嘿,我来帮你搞定这个数组过滤的问题~ 先拆解下你遇到的小状况,再给你两种靠谱的解决方案:
首先说下你原有代码的问题:filter的回调函数需要返回布尔值来决定是否保留当前元素,你返回x虽然因为对象是真值能勉强运行,但逻辑不够清晰;另外,每次用find遍历整个arr2,当数组元素较多时,效率会很低。还有,如果你的代码不是在类的方法中,用this.arr1和this.arr2可能会因为this指向错误导致找不到数组,进而报错。
方案1:直观的优化版
用some代替find,直接返回布尔判断结果,逻辑更简洁直接:
const arr3 = arr1.filter(x => arr2.some(y => y.age === x.age));
some方法会在找到第一个匹配的age后立刻停止遍历并返回true,比find返回对象再判断是否存在要更高效且易读。
方案2:高效的Set查找法(适合大数据量)
如果arr2的元素比较多,先把arr2里的所有age提取到一个Set中,这样查找age是否存在的时间复杂度是O(1),整体效率会提升很多:
// 先把arr2的age都存入Set const arr2AgeSet = new Set(arr2.map(item => item.age)); // 过滤arr1,只保留age在Set中的元素 const arr3 = arr1.filter(x => arr2AgeSet.has(x.age));
不管用哪种方案,最终都能得到你期望的结果:
// 输出:[{name: 'Jake', age: 17}, {name: 'Ryan', age: 18}] console.log(arr3);
要是你原来的代码报错,大概率是this的指向问题——如果是在全局作用域或者普通函数里,直接用arr1和arr2就行,不用加this前缀哦。
内容的提问来源于stack exchange,提问作者Cray
相关产品推荐
相关产品推荐

