按ID匹配合并两个对象数组失败,请求修正代码方案
问题:通过ID匹配数组并添加字段失败的解决方法
问题原因
你的代码里用secondData.some()仅判断是否存在匹配ID的元素,但secondItem是some回调里的局部变量,在回调外部根本访问不到,这就导致highest: secondItem.score这一行会直接报错secondItem is not defined。
修正后的代码
let result = firstData.map(item => { // 用find找到对应ID的元素,找不到就返回undefined const matchedItem = secondData?.find(secondItem => secondItem.id === item.id); return { ...item, highest: matchedItem ? matchedItem.score : '' }; }); console.log("result", result);
说明
- 替换
some()为find():find()会返回第一个匹配ID的对象,没有匹配项时返回undefined - 可选链
secondData?.find():防止secondData为空或未定义时触发报错 - 三元运算符:处理匹配成功和失败的两种情况,分别赋值对应score或空字符串
大数据量场景优化
如果两个数组的元素数量较多,每次map里调用find的时间复杂度是O(n*m),效率较低。可以先把第二个数组转成以ID为键的Map,将整体时间复杂度降到O(n+m):
// 先把secondData转成ID对应score的Map const scoreMap = new Map(secondData.map(item => [item.id, item.score])); let result = firstData.map(item => { return { ...item, highest: scoreMap.get(item.id) || '' }; }); console.log("result", result);
内容的提问来源于stack exchange,提问作者John Ken
相关产品推荐
相关产品推荐

