为何循环始终输出数组最后一组键值对而非全部?
问题原因
你第一段代码的问题出在对象引用上:let b = a 并没有创建新对象,只是让变量b和a指向内存里的同一个对象。循环第一次执行时,你给这个共享对象的key属性赋值{key1:"value1"};第二次循环时,又把同一个对象的key属性替换成了{key2:"value2"}。所以两次输出的都是最后一次修改的结果——你从头到尾操作的都是同一个对象。
解决方法
核心思路是:每次循环都基于原对象生成一个独立的副本,而不是直接引用原对象。根据原对象的结构复杂度,选择对应的拷贝方式:
1. 浅拷贝(针对无嵌套的简单对象)
如果你的原对象是单层结构(比如{key3:"value3", key4:"value4"}),用对象展开语法{...原对象}或者Object.assign()就能创建独立副本:
// 假设这是你需要传入的已有对象 const baseObj = { key3: "value3", key4: "value4" }; const targetEntries = Object.entries({ key1: "value1", key2: "value2" }); for (const entry of targetEntries) { // 每次循环创建baseObj的浅拷贝 const newObj = { ...baseObj }; // 将拆分后的小对象赋值给key5 newObj.key5 = Object.fromEntries(new Map([entry])); console.log(newObj.key5); console.log(newObj); }
2. 深拷贝(针对有嵌套属性的对象)
如果原对象包含嵌套对象,浅拷贝只会复制外层对象的引用,嵌套部分还是共享的。这种场景下,可以用JSON.parse(JSON.stringify(原对象))(注意:这种方法无法处理函数、Symbol、undefined等特殊类型),或者用Lodash的深拷贝工具:
用JSON方法实现深拷贝:
const baseObj = { key3: "value3", key4: "value4", nested: { foo: "bar" } }; const targetEntries = Object.entries({ key1: "value1", key2: "value2" }); for (const entry of targetEntries) { // 创建baseObj的深拷贝,嵌套属性也会被复制 const newObj = JSON.parse(JSON.stringify(baseObj)); newObj.key5 = Object.fromEntries(new Map([entry])); console.log(newObj.key5); console.log(newObj); }
用Lodash实现深拷贝:
先安装依赖:
npm install lodash @types/lodash
然后编写代码:
import cloneDeep from 'lodash/cloneDeep'; const baseObj = { key3: "value3", key4: "value4", nested: { foo: "bar" } }; const targetEntries = Object.entries({ key1: "value1", key2: "value2" }); for (const entry of targetEntries) { const newObj = cloneDeep(baseObj); newObj.key5 = Object.fromEntries(new Map([entry])); console.log(newObj.key5); console.log(newObj); }
内容的提问来源于stack exchange,提问作者Neel Kallidai
相关产品推荐
相关产品推荐

