如何在JavaScript中为对象数组中仅特定元素的属性赋值?

如何在JavaScript中为对象数组中仅特定元素的属性赋值?,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组,并使用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); 但是,不是将该值指定给该特定对象的属性,而是阵列中的所有对象都将其自己的属性指定为相同的值

我有一个对象数组,并使用
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
 }
];
所有三个对象的
test_1
属性值均为5,而不是仅第一个对象的
test_1
属性值为5

因此,我的问题是:

  • 为什么
    f()
    将相同的值分配给数组中所有元素的相同属性
  • 如何仅为数组的特定元素的属性赋值

不要使用
数组。除非您想用基元类型填充它,否则请填充

通过这个
let data=Array(3).fill({test_1:0,test_2:true})
您每次都传递相同的对象,因此您的数组包含相同对象的3倍,那么如果您修改数组的任何元素,实际上它是通过引用修改的相同对象。为了避免这种情况,请使用
Array.from
语法并结合map回调。像这样:

let data=Array.from({length:3},{=>({test_1:0,test_2:true}))
函数f(索引){
数据[索引]。测试_1=5;
控制台日志(数据);
}
f(0)

。作为控制台包装{max height:100%!important;top:0;}
由于每个人都指向内存中的同一地址,其中一个地址的更改也会导致其他地址的更改

这应该起作用:

let data=[…数组(3)].map(()=>({test_1:0,test_2:true}));
函数f(索引){
数据[索引]。测试_1=5;
控制台日志(数据);
}

f(0)
您正在将一个对象传递给
fill
,因此
fill
将在每个索引处放置该对象。它们都是对您创建的唯一对象的引用“所有三个对象的值都是5”-不,只有一个对象。