Javascript/ES6 forEach问题

Javascript/ES6 forEach问题,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在尝试遍历对象的数组,修改每个对象,并将结果推送到新的数组 数组中的对象具有不同的值。当我检查生成的数组时所有对象都具有相同的值。它们都反映了原始数组中最后一个对象 例如: const a = { choo: 'choo' } const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ] let c = []; b.forEach((item) => { c.push(Object.assign(a, {...item}

我正在尝试遍历
对象的
数组
,修改每个
对象
,并将结果推送到新的
数组

数组中的
对象
具有不同的值。当我检查生成的
数组时
所有
对象
都具有相同的值。它们都反映了原始
数组中最后一个
对象

例如:

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' } 
]
{…b}
,必须是
{…item}


不是
{…b}
,必须是
{…item}

问题是您的
{…b}
-您正在复制
b
中对象的所有属性,而您只想复制迭代的项的属性

const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
常数c=[];
b、 forEach((项目)=>{
c、 推(Object.assign(item,a));
});

控制台日志(c)
问题在于您的
{…b}
-您正在复制
b
中对象的所有属性,而您只想复制您正在迭代的项的属性

const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
常数c=[];
b、 forEach((项目)=>{
c、 推(Object.assign(item,a));
});
控制台日志(c)
我试图循环遍历一个对象数组,修改每个对象,并将结果推送到一个新数组中

听起来你想要的是
.map
,而不是
.forEach

当我检查结果数组时,所有对象都具有相同的值。它们都反射原始阵列中的最后一个对象

这是因为
Object.assign
修改对象。您正在多次修改
a
,并创建一个数组,其中包含对
a
的多个引用

答案是将空对象作为第一个参数传递给
object.assign
(并使用
map
)。
{…item}
的使用也毫无意义,因此我将其替换为
item

const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
const c=b.map((item)=>Object.assign({},a,item));
控制台日志(c)
我试图循环遍历一个对象数组,修改每个对象,并将结果推送到一个新数组中

听起来你想要的是
.map
,而不是
.forEach

当我检查结果数组时,所有对象都具有相同的值。它们都反射原始阵列中的最后一个对象

这是因为
Object.assign
修改对象。您正在多次修改
a
,并创建一个数组,其中包含对
a
的多个引用

答案是将空对象作为第一个参数传递给
object.assign
(并使用
map
)。
{…item}
的使用也毫无意义,因此我将其替换为
item

const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
const c=b.map((item)=>Object.assign({},a,item));

控制台日志(c)
是的,这就是
Object.assign
的工作原理:它修改并返回目标,但不创建新对象。所有结果都引用作为目标传递的
a

你在找什么

const c = b.map(item => ({...a, ...item})); // with object spread syntax


是的,
Object.assign
就是这样工作的:它修改目标并返回它,但不创建新对象。所有结果都引用作为目标传递的
a

你在找什么

const c = b.map(item => ({...a, ...item})); // with object spread syntax


对象。分配,此函数将更改您的对象a,并返回对象a的引用

这意味着,在每个循环中更改对象a,并将其引用推送到数组c

最后,您将得到数组c,其中包括对象a的三个引用。此刻,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 ));
});

对象。分配,此函数将更改您的对象a,并返回对象a的引用

这意味着,在每个循环中更改对象a,并将其引用推送到数组c

最后,您将得到数组c,其中包括对象a的三个引用。此刻,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 ));
});

对不起,简化了我的问题代码,我使用的是
{…item}
。我已经更新了问题对不起,简化了我的问题代码,我正在使用
{…item}
。我已经更新了一个没有改变原始对象的问题,他说他确实想修改它。@CertainPerformance我猜OP只是用了一个很糟糕的词,但是很公平。我添加了一个附录。但这并没有改变原来的对象,他说他确实想修改它。@CertainPerformance我猜OP只是用了一个糟糕的词,但很公平。我增加了一个附录。