繁体   English   中英

使用循环用对象填充数组

[英]Fill array with objects using loop

我需要创建一个充满对象的数组。 可以说{ foo: 0} 然后,我想向每个具有不同值的对象添加属性bar 例如:value =数组中项目的索引。

看起来像这样

const table = new Array(10).fill({foo: 0});

for (let i = 0; i < table.length; i += 1) {
    table[i].bar = i;
}

我期望得到的是:

[
    { foo: 0, bar: 0 },
    { foo: 0, bar: 1 },
    { foo: 0, bar: 2 },
    ...
    { foo: 0, bar: 9 }
]

而我得到的是:

[
    { foo: 0, bar: 9 },
    { foo: 0, bar: 9 },
    { foo: 0, bar: 9 },
    ...
    { foo: 0, bar: 9 }
]

为什么会这样呢? 我在哪里弄错了?

演示

编辑澄清

我不想用新对象(如table[i] = {foo: 0, bar: i}替换数组中的对象。 它创建新的对象来代替旧的对象。 我只想向现有对象添加属性。

您的数组具有对单个对象的引用。 因此,正在发生的事情是您要更新相同的基础对象。 如果您熟悉C,那就像拥有N个指向同一基础对象的指针一样。 无论您对哪个N指针进行操作,都将更改基本的基础对象。

const table = new Array(10)

for (let i = 0; i < table.length; i += 1) {
   table[i] = {foo: 0, bar: i}
}

这将为数组中的每个条目创建一个新对象

恕我直言,您正在寻找这样的东西:

 const table = new Array(10); for (let i = 0; i < table.length; i += 1) { table[i] = {'foo': 0, 'bar': i}; } console.log(table) 

一种使用ECMAScript-6班轮解决方案:

 const table = Array.from(new Array(10).keys()).map(e => ({'foo': 0, 'bar': e})) console.log(table) 

Array.fill()获取一个值,并用它填充数组。 由于非基本体(对象,数组)是通过引用传递的,因此任何项目的修改都会导致其余部分也发生变化。

相反,您可以使用Array.from()并将对象传递给其映射函数:

 const table = Array.from({length:10}, _ => ({foo:0})); for (let i = 0; i < table.length; i += 1) { table[i].bar = i; } console.log(table); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM