如何从旧数组移除不匹配对象并替换新数组中对应匹配对象?
解决方案
要实现你需要的两个操作(替换arr2的匹配项、过滤arr1的不匹配项),核心是基于name字段做匹配,以下是具体实现:
步骤说明
- 给arr1建立一个以
name为键的映射表,方便快速查找匹配对象,提升效率; - 遍历arr2,用arr1里的匹配对象替换对应项,无匹配则保留原对象;
- 过滤arr1,只保留那些在arr2里有对应
name的对象。
代码实现
const arr1 = [{ name: 'peter' }, { name: 'sam', id: 1 }, { name: 'mark' }]; const arr2 = [{ name: 'sam' }, { name: 't' }, { name: 'george' }]; // 构建arr1的name映射表 const arr1NameMap = new Map(arr1.map(item => [item.name, item])); // 更新arr2:替换匹配项 const updatedArr2 = arr2.map(item => arr1NameMap.get(item.name) || item); // 更新arr1:移除不匹配项 const updatedArr1 = arr1.filter(item => arr2.some(arr2Item => arr2Item.name === item.name)); // 查看结果 console.log('更新后的arr2:', updatedArr2); // 输出:[{ name: 'sam', id: 1 }, { name: 't' }, { name: 'george' }] console.log('更新后的arr1:', updatedArr1); // 输出:[{ name: 'sam', id: 1 }]
补充说明
- 如果你的匹配条件不是
name字段,只需要修改映射表的键和过滤时的判断条件即可; - 上面的代码会生成新数组,不会修改原数组,避免意外副作用。如果一定要直接修改原数组,可以参考下面的写法:
// 直接修改arr2 arr2.forEach((item, idx) => { const match = arr1.find(a => a.name === item.name); if (match) arr2[idx] = match; }); // 直接修改arr1(注意:如果arr1是const声明的,需要改成let) let arr1 = [{ name: 'peter' }, { name: 'sam', id: 1 }, { name: 'mark' }]; arr1 = arr1.filter(item => arr2.some(a => a.name === item.name));
内容的提问来源于stack exchange,提问作者lorem Marston
相关产品推荐
相关产品推荐

