如何用for循环结合Object.assign仅赋值object1中的5个对象?
问题分析与解决方案
首先得理清你的场景:你提到object1包含10个对象,但这里可能有两种情况——object1是数组(元素为对象),或是普通对象(属性值为对象)。你的原代码无法运行,主要有几个核心问题:
- 没有初始化
object2,第一次循环时object2处于未定义状态; - 每次循环直接覆盖
object2,而非把新对象累加进目标集合; - 如果
object1是普通对象,用数字索引i去取object1[i]是无效的(除非你的属性键正好是数字字符串)。
下面分两种场景给你解决办法:
场景1:object1是包含10个对象的数组
如果你想取数组的前5个对象组成新数组object2,最简单的方法是用数组的slice方法:
// 浅拷贝前5个元素,直接得到新数组 const object2 = object1.slice(0, 5);
如果一定要用for循环实现(比如需要手动处理每个对象的拷贝逻辑),可以这样写:
// 先初始化object2为空数组 const object2 = []; for (let i = 0; i < 5; i++) { // 用Object.assign做浅拷贝,避免后续修改影响原数组的对象 object2.push(Object.assign({}, object1[i])); // 如果不需要拷贝,直接写 object2.push(object1[i]) 也可以 }
场景2:object1是拥有10个属性的普通对象(属性值为对象)
如果object1是类似{ key0: obj0, key1: obj1, ..., key9: obj9 }的结构,你需要先获取它的属性键,再取前5个赋值给object2:
const object2 = {}; // 获取object1的所有属性键(ES6+中会按插入顺序排列,数字键会自动排序) const keys = Object.keys(object1); for (let i = 0; i < 5; i++) { const key = keys[i]; // 同样用Object.assign做浅拷贝,避免修改object2的对象影响原对象 object2[key] = Object.assign({}, object1[key]); // 不需要拷贝的话直接赋值:object2[key] = object1[key] }
补充说明
- 如果你需要深拷贝(比如对象里还有嵌套对象),
Object.assign只能做浅拷贝,这时候可以考虑用JSON.parse(JSON.stringify(xxx))(注意有局限性,不能处理函数、Symbol等特殊类型),或者第三方库如Lodash的_.cloneDeep。 - 原代码里
Object.assign(object1[i])的写法是把object1[i]作为源对象,但没有指定目标对象,相当于创建了一个该对象的浅拷贝,但每次循环都会把object2替换成这个单对象,所以最终object2只会是第4个索引对应的对象(循环结束时i=4),而不是包含5个对象的集合。
内容的提问来源于stack exchange,提问作者noyruto88
相关产品推荐
相关产品推荐

