更改Javascript数组内的对象值

时间:2018-11-29 11:00:43

标签: javascript arrays

这个问题可能被问过几次,但是我遇到的错误很奇怪。我一周前才刚开始使用Javascript。

我有一个函数可以更改声明的对象的属性。为了简化该问题,我在下面添加了代码段。

我试图将一个对象添加到数组几次,而在另一个for循环中,我试图更改数组内部对象的属性值。

function dataPacket(buffer, label) {
  var packet = {
    data: []
  }

  var packetArray = [];
  for (var i = 0; i < buffer.length; i++) {
    packetArray.push(packet);
  }

  for (var i = 0; i < buffer.length; i++) {
    packetArray[i].data = buffer[i];
    console.log("At " + i + "= " + packetArray[i].data);
  }

  console.log(packetArray[0].data);
  console.log(packetArray[1].data);
}

dataPacket([
  [1, 2, 3, 4, 5],
  [5, 6, 7, 8, 9]
], ["random data in strings"]);

当第一个for循环打印出数组的值时,两个索引上的值似乎都不同,但是就像调用循环外的控制台日志时一样,两个索引上的两个值都似乎是相同。在第二个循环之后,它似乎已被覆盖。

我可能在做傻事。 我也尝试过这样做,结果似乎还可以,但是必须在for循环中完成此过程才能保持过程的动态。

console.log("Size of array: " + packetArray.length);
packetArray[0].data = buffer[0];
console.log("Buffer at 0: " +  packetArray[0].data);
packetArray[1].data = buffer[1];
console.log("Buffer at 1: " + packetArray[1].data);

2 个答案:

答案 0 :(得分:1)

这是因为同一packet对象被推入数组,并且当您从任何地方更改packet数据时,该数据都会在引用的任何地方得到反映。请尝试以下操作,我刚刚删除了对象packet

function dataPacket( buffer, label ) {
    
    var packetArray = [];
    for(var i = 0; i < buffer.length; i++) {
      packetArray.push({ data:[] });
    }

    for(var i = 0; i< buffer.length; i++) {
      packetArray[i].data = buffer[i];
      console.log("At " + i + "= " + packetArray[i].data);
    }

    console.log(packetArray[0].data);
    console.log(packetArray[1].data);

}

dataPacket([ [1,2,3,4,5], [5,6,7,8,9] ], ["random data in strings"] );

答案 1 :(得分:0)

您创建一个packet并将其推送到数组的多个位置。那不会复制数据包,但会引用它。更改packetArray[0]确实会更改packet,因此也会更改packetArray[1],因为它们都引用相同的内容。将packet声明移入循环,为每个索引创建一个新数据包。

我将其写为:

 const packetArray = Array.from(buffer, data => ({ data }));