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

如何依据arr2结构筛选arr1数据并生成目标数组?

解决JavaScript数组按结构提取数据的问题

实现代码

const arr1 = [{id:'1', List:[{name:'a', title:'a title'}, {name:'b', title:'b title'}]}, {id:'2', List:[{name:'c', title:'c title'}, {name:'d', title:'d title'}]}];
const arr2 = [{id:'1', name:'a'}, {id:'1', name:'b'}, {id:'2', name:'c'}];

// 构建id到需保留name集合的映射
const idToNames = arr2.reduce((map, item) => {
  if (!map[item.id]) {
    map[item.id] = new Set();
  }
  map[item.id].add(item.name);
  return map;
}, {});

// 过滤arr1生成目标数组
const newArr = arr1.map(item => ({
  ...item,
  List: item.List.filter(listItem => idToNames[item.id]?.has(listItem.name))
}));

console.log(newArr);

逻辑说明

  1. 构建映射表:用reduce遍历arr2,把每个id对应的name存入Set集合,后续判断name是否需要保留时,时间复杂度为O(1),比多次遍历arr2高效。
  2. 过滤arr1数据:遍历arr1的每个元素,对其List数组进行过滤,只保留那些name存在于对应id集合中的项,同时用扩展运算符复制原对象属性,避免修改原数组。

这种方法比三层forEach更简洁高效,也能避免嵌套循环导致的逻辑混乱。

内容的提问来源于stack exchange,提问作者ddon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:20:59