我正在尝试遍历Array
Objects
,修改每个Object
,并将结果推送到新的Array
。
数组中的Objects
具有不同的值。当我检查结果Array
时,所有Objects
都具有相同的值。它们都反映了原始Object
Array
例如:
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
let c = [];
b.forEach((item) => {
c.push(Object.assign(a, {...item} ));
});
c
的结果:
[
{ foo: 'foo', choo: 'choo' },
{ foo: 'foo', choo: 'choo' },
{ foo: 'foo', choo: 'choo' }
]
我认为这是某种范围问题,但我不确定如何解决它。
预期结果将是
[
{ foo: 'bar', choo: 'choo' },
{ foo: 'baz', choo: 'choo' },
{ foo: 'foo', choo: 'choo' }
]
答案 0 :(得分:4)
我正在尝试遍历一个对象数组,修改每个对象,并将结果推送到一个新的数组中。
听起来像你想要的是.map
,而不是.forEach
。
当我检查生成的数组时,所有对象都具有相同的值。它们都反映了原始数组中的最后一个对象
这是因为Object.assign
修改了对象。您正在多次修改a
并创建一个包含多个a
引用的数组。
答案是将一个空对象作为第一个参数传递给Object.assign
(并使用map
)。 {...item}
的使用也毫无意义,因此我将其替换为item
:
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
const c = b.map((item) => Object.assign({}, a, item));
console.log(c);
编辑如果您确实想要修改原始对象,可以通过将参数的顺序更改为Object.assign
来实现,以便{ {1}}是第一个。我不建议这样做:
item
答案 1 :(得分:1)
是的,这就是Object.assign
的工作原理:它修改目标并返回它,它不会创建新对象。您的所有结果都会引用您作为目标传递的a
。
您正在寻找
const c = b.map(item => ({...a, ...item})); // with object spread syntax
或
const c = b.map(item => Object.assign({}, a, item)); // with Object.assign
答案 2 :(得分:0)
b.forEach((item) => {
c.push(Object.assign(a, {...item} ));
});
不是{...b}
,必须是{...item}
答案 3 :(得分:0)
问题在于{...b}
- 您只需复制b
中对象的所有属性,当您只想复制项目的属性时#&# 39;重复迭代。
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
const c = [];
b.forEach((item) => {
c.push(Object.assign(item, a));
});
console.log(c);

您还希望Object.assign的第一个参数成为您正在变异的对象。
答案 4 :(得分:0)
Object.assign ,此功能会更改对象,并返回对象a 的引用。
这意味着,您将对象改为,并在每个循环中将其引用推送到 array c 。
最后,您将获得包含对象a的三个引用的数组c。这一刻,a {foo:' foo',choo:' choo' } 。
如何解决?
关键是,在每个循环中推送对数组c的不同引用。
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
let c = [];
b.forEach((item) => {
c.push(Object.assign({}, a, item ));
});