You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:52:37