JavaScript:通过指定数组过滤对象数组,现有代码返回空数组求修正
解决对象数组按指定数值过滤的问题
原代码返回空数组的原因是逻辑错误:你用了索引位置对应对比(obj[i].value === filterNumbers[i]),而不是检查对象的value是否属于过滤数组。比如循环到第0位时,拿obj[0].value(1)和filterNumbers[0](2)对比,不匹配;第1位时obj[1].value(2)和filterNumbers[1](4)对比也不匹配,所以最终结果为空。
下面是几种正确的实现方式:
方法1:用filter + includes(最简洁)
var filterNumbers = [2, 4]; var obj = [ {value: 1, lang: 'South'}, {value: 2, lang: 'North'}, {value: 3, lang: 'East'}, {value: 4, lang: 'Test1'}, {value: 5, lang: 'Test2'}, {value: 6, lang: 'Test3'}, ]; const myArray = obj.filter(item => filterNumbers.includes(item.value)); console.log(myArray);
filter()遍历对象数组,只保留满足条件的元素;includes()判断当前元素的value是否在过滤数组中,符合条件就会被加入结果数组。
方法2:修改原for循环的判断逻辑
如果你想保留for循环的写法,只需要把判断条件改成检查value是否在过滤数组里:
var filterNumbers = [2, 4]; var obj = [ {value: 1, lang: 'South'}, {value: 2, lang: 'North'}, {value: 3, lang: 'East'}, {value: 4, lang: 'Test1'}, {value: 5, lang: 'Test2'}, {value: 6, lang: 'Test3'}, ]; let myArray = []; for (let i = 0; i < obj.length; i++) { if (filterNumbers.includes(obj[i].value)) { myArray.push(obj[i]); } } console.log(myArray);
方法3:用Set提升性能(适合大过滤数组)
如果过滤数组元素很多,用Set的has()方法比数组includes()效率更高(时间复杂度O(1) vs O(n)):
var filterNumbers = [2, 4]; var filterSet = new Set(filterNumbers); var obj = [ {value: 1, lang: 'South'}, {value: 2, lang: 'North'}, {value: 3, lang: 'East'}, {value: 4, lang: 'Test1'}, {value: 5, lang: 'Test2'}, {value: 6, lang: 'Test3'}, ]; const myArray = obj.filter(item => filterSet.has(item.value)); console.log(myArray);
以上三种方法都能得到你期望的结果:
[ {value: 2, lang: 'North'}, {value: 4, lang: 'Test1'} ]
内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara
相关产品推荐
相关产品推荐

