You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:28