循环中Object.assign未按预期复制的问题咨询
解决对象数组中仅复制指定键值对的问题
嘿,我来帮你理清这个问题~你遇到的核心问题其实是没有真正创建新对象,虽然你知道对象是按引用传递,但可能对Object.assign和lodashpick的用法细节没摸透,导致cusipObj还是和原item指向同一个引用。
先说说你之前可能踩的坑
如果你的代码是类似这样的:
// 错误示例:修改了原对象,没有创建新对象 const cusipObj = Object.assign(item, { Cusip: item.Cusip }); summaryList.push(cusipObj);
那Object.assign的第一个参数是原item对象,这时候它是在修改原item,而不是生成新对象,所以cusipObj和item自然是同一个引用,看起来就完全相等了。
至于lodash的pick,如果你的写法是直接操作原对象(比如没接收返回值),也会出现类似问题——其实pick本身是返回新对象的,只是你可能没正确使用它的返回值。
正确的几种实现方式
1. 最直观的:对象字面量创建新对象
这是最简单也不容易出错的方式,直接生成一个只包含目标键值对的新对象:
// 遍历数组时的操作 summaryList.push({ Cusip: item.Cusip });
每次循环都会新建一个独立的对象,和原item没有任何引用关系,完美符合你的需求。
2. 正确使用Object.assign
要让Object.assign生成新对象,第一个参数必须是一个空对象,这样它会把后续对象的键值对复制到这个空对象里,返回全新的对象:
const cusipObj = Object.assign({}, { Cusip: item.Cusip }); summaryList.push(cusipObj);
本质和第一种方式一样,都是创建新对象。
3. 正确使用lodash的pick
pick方法本身就会返回一个只包含指定键的新对象,只要正确接收它的返回值就行:
const cusipObj = _.pick(item, ['Cusip']); summaryList.push(cusipObj);
这样返回的cusipObj是全新的对象,和原item没有引用关联,不会出现相等的情况。
核心总结
不管用哪种方法,关键都是要创建新的对象,而不是在原对象上修改或者直接引用原对象。只要保证每次循环生成的是独立的新对象,就不会再出现cusipObj和item相等的问题啦~
内容的提问来源于stack exchange,提问作者eagercoder
相关产品推荐
相关产品推荐

