JS两个对象数组属性复制问题:循环仅获最后一个seat值
问题分析与解决方案
这问题我之前也碰到过!核心问题出在你用了嵌套循环,咱们一步步拆解:
为什么你的代码会只保留最后一个值?
你写的嵌套循环逻辑是:每遍历一个arr1的元素,就把arr2的所有元素的num都赋值为当前arr1元素的seat。举个例子:
- 当
i=0(对应arr1里的seat: '12'),内层循环会把arr2[0].num和arr2[1].num都改成'12' - 当
i=1(对应arr1里的seat: '8'),内层循环又会把arr2的两个元素的num都覆盖成'8'
最后自然所有num都是arr1最后一个元素的seat值了。
正确的实现方式
如果你的需求是按数组索引顺序对应赋值(arr1[0]的seat给arr2[0]的num,arr1[1]的seat给arr2[1]的num),只需要一层循环就够了:
方式1:普通for循环
let arr1 = [{'id': 'ee', 'seat': '12'}, {'id': 'aa', 'seat': '8'} ]; let arr2 = [ {'id': 's22', 'num': ''}, {'id': '2s2', 'num': ''} ]; for (let i = 0; i < arr1.length; i++) { // 加个判断避免数组越界(如果arr2比arr1短的话) if (arr2[i]) { arr2[i].num = arr1[i].seat; } } console.log(arr2); // 输出结果: // [ { id: 's22', num: '12' }, { id: '2s2', num: '8' } ]
方式2:forEach(更简洁)
如果你喜欢更现代的写法,用forEach遍历arr1,同时利用索引对应arr2的元素:
arr1.forEach((item, index) => { if (arr2[index]) { arr2[index].num = item.seat; } });
扩展:如果是按条件匹配赋值(比如id对应)
如果以后你的需求变成根据id匹配赋值(虽然当前示例里两个数组的id不对应,但可以提前了解),可以用find方法:
// 假设arr1和arr2有可匹配的id字段 arr2.forEach(item2 => { const matchedItem = arr1.find(item1 => item1.id === item2.id); if (matchedItem) { item2.num = matchedItem.seat; } });
内容的提问来源于stack exchange,提问作者Shehab Eltawel
相关产品推荐
相关产品推荐

