我有一个对象数组,并使用Array.prototype.fill()
分配它们的属性和值。我想为数组中特定元素的属性指定一个新值。
例如:
let data = Array(3).fill({test_1: 0, test_2: true});
function f(index) {
data[index].test_1 = 5;
console.log(data);
}
f(0);
但是,数组中的所有对象都有自己的属性,而不是将该值指定给特定对象的属性。
这是输出:
// Actual result
[
{
test_1: 5,
test_2: true
},
{
test_1: 5,
test_2: true
},
{
test_1: 5,
test_2: true
}
];
// Expected result
[
{
test_1: 5,
test_2: true
},
{
test_1: 0,
test_2: true
},
{
test_1: 0,
test_2: true
}
];
不是只有第一个对象将5作为test_1
属性的值,而是所有三个对象都将5作为其test_1
属性的值。
所以,我的问题是:
- 为什么
f()
为数组中所有元素的相同属性分配相同的值 - 如何仅为数组中特定元素的属性赋值
除非您想用基元类型填充Array.fill
,否则不要使用它。
通过这个let data = Array(3).fill({test_1: 0, test_2: true})
,您每次都传递相同的对象,所以您的数组包含3倍的相同对象,那么如果您修改数组的任何元素,实际上它是通过引用修改的相同对象。为了避免这种情况,请将Array.from
语法与映射回调结合使用。像这样:
let data = Array.from({length: 3}, _ => ({test_1: 0, test_2: true}))
function f(index) {
data[index].test_1 = 5;
console.log(data);
}
f(0)
.as-console-wrapper { max-height: 100% !important; top: 0; }
由于每个人都指向内存中的同一地址,其中一个地址的更改也会导致其他地址的更改。
这应该有效:
let data = [...Array(3)].map(() => ({ test_1: 0, test_2: true }));
function f(index) {
data[index].test_1 = 5;
console.log(data);
}
f(0);