JavaScript中如何高效将数组对象属性添加到另一数组对象
高效实现数组元素属性同步方案
你的现有代码问题
- 重复遍历导致低效:每次
forEach循环里都执行array1.map(f => f.id),这会完整遍历array1一遍,时间复杂度变成O(n*m)(n是array2长度,m是array1长度),数据量大时性能很差。 - 索引查找错误:
array1.indexOf(e["id"])是在array1数组中查找字符串类型的id值,但array1的元素是对象,所以永远返回-1,根本无法定位到对应的元素,自然无法完成属性添加。
正确高效的实现方式
核心思路是先建立array1的id映射表,把查找操作的时间复杂度降到O(1),之后遍历array2时直接通过id快速匹配对应元素,整体时间复杂度为O(n+m),是最优的线性复杂度。
代码实现
// 第一步:建立array1的id到元素的映射,用Map更直观(也可以用普通对象) const array1Map = new Map(); array1.forEach(item => { array1Map.set(item.id, item); }); // 第二步:遍历array2,同步temp属性 array2.forEach(item => { const targetItem = array1Map.get(item.id); if (targetItem) { targetItem.temp = item.temp; // 如果需要同步name(虽然示例中name一致,但如果有不一致的情况可以加上) // targetItem.name = item.name; } });
为什么高效
- 建立映射表只需要遍历array1一次,之后每次查找元素都是O(1)的直接访问。
- 遍历array2也是一次线性遍历,整体操作没有嵌套循环,性能远优于你之前的实现。
- 直接修改原array1的元素,完全符合“不使用新数组”的要求,最终array1的结构会和array2一致。
验证结果
执行完上述代码后,array1会变成:
[ {"name": "a", "id": "1", "temp": "temp1"}, {"name": "b", "id": "2", "temp": "temp2"}, {"name": "c", "id": "3", "temp": "temp3"}, {"name": "c", "id": "4", "temp": "temp4"} ]
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

