[英]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.