如何根据array2修改array1中productID=1的对象的orderId?
正确实现方案:按规则修改数组对象的orderId
原始数据
let array1 = [ { id:1, name:'name1', orderId:3, productID:1}, { id:2, name:'name2', orderId:2, productID:1}, { id:3, name:'name3', orderId:1, productID:2}, { id:4, name:'name4', orderId:4, productID:1}, { id:5, name:'name5', orderId:2, productID:2}, { id:6, name:'name6', orderId:4, productID:2}, { id:7, name:'name7', orderId:3, productID:1} ] let array2 = [4,2,7,1]; // 这是id的数组
需求说明
修改array1中productID等于1的对象的orderId,规则如下:
array2中id的顺序对应orderId的数值(索引+1)- 示例:
array2第一个id为4,对应array1中id=4的对象orderId设为1;第二个id为2,对应对象orderId设为2,以此类推。
原代码问题
原代码嵌套多层循环,逻辑冗余且错误:
- 遍历
array1对象后又遍历对象属性,完全没必要 - 条件判断逻辑混乱,仅打印对象未执行修改操作
正确实现方案
方案1:构建映射表(高效)
先将array2转换为id: orderId的映射对象,再遍历array1修改符合条件的对象,时间复杂度为O(n+m),效率更高。
// 构建id到orderId的映射:索引+1即为对应orderId const idToOrderMap = array2.reduce((map, id, index) => { map[id] = index + 1; return map; }, {}); // 遍历array1修改目标对象 array1.forEach(item => { if (item.productID === 1) { item.orderId = idToOrderMap[item.id]; } }); console.log(array1);
方案2:直接遍历修改(直观)
数据量较小时,可直接遍历array2,找到array1中对应id且productID=1的对象修改orderId:
array2.forEach((id, index) => { const targetItem = array1.find(item => item.id === id && item.productID === 1); if (targetItem) { targetItem.orderId = index + 1; } }); console.log(array1);
预期输出
[ { id:1, name:'name1', orderId:4, productID:1}, { id:2, name:'name2', orderId:2, productID:1}, { id:3, name:'name3', orderId:1, productID:2}, { id:4, name:'name4', orderId:1, productID:1}, { id:5, name:'name5', orderId:2, productID:2}, { id:6, name:'name6', orderId:4, productID:2}, { id:7, name:'name7', orderId:3, productID:1} ]
内容的提问来源于stack exchange,提问作者Ankit Rajput
相关产品推荐
相关产品推荐

