如何用forEach比较两个对象数组并按ID匹配执行条件?
问题分析与解决方案
你的代码核心问题
- 索引匹配逻辑错误:你通过
result2[index]获取元素是完全错误的,两个数组的元素顺序、长度都不对应。比如result1的第0个元素id是1,result2的第0个元素id是2,根本不是同一id的元素;当index超过result2的长度(比如index=2、3),result2[index]会返回undefined,访问num2.id自然会报错。 - forEach的使用误区:forEach本身没有返回值,它只是遍历执行回调函数,你需要手动维护一个结果数组来存储每一次判断后的输出,而不是试图让forEach直接返回结果。
正确实现方式
推荐先把result2的id提取到Set中(查找效率更高),再遍历result1做判断,同时用一个数组存储最终结果:
var result1 = [ {id:1, name:'Sandra', type:'user', username:'sandra'}, {id:2, name:'John', type:'admin', username:'johnny2'}, {id:3, name:'Peter', type:'user', username:'pete'}, {id:4, name:'Bobby', type:'user', username:'be_bob'} ]; var result2 = [ {id:2, name:'John', email:'johnny@example.com'}, {id:4, name:'Bobby', email:'bobby@example.com'} ]; // 先把result2的id存入Set,方便快速查找 const result2IdSet = new Set(result2.map(item => item.id)); // 存储最终结果的数组 const finalResult = []; result1.forEach(item => { if (result2IdSet.has(item.id)) { // ID匹配时存入null finalResult.push(null); } else { // ID不匹配时存入你需要的指定值,这里示例用原元素,可自行替换 finalResult.push(item); } }); console.log(finalResult);
补充:用map实现(更简洁)
如果你想回到map方法,只要调整返回逻辑就能满足需求,不用只返回布尔值:
const result2IdSet = new Set(result2.map(item => item.id)); const finalResult = result1.map(item => { return result2IdSet.has(item.id) ? null : item; });
内容的提问来源于stack exchange,提问作者Still_Learning
相关产品推荐
相关产品推荐

