首页 > 解决方案 > 更改 Javascript 数组中的对象值

问题描述

这个问题可能已经被问过几次,但我得到的错误很奇怪。一周前我刚开始使用 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);

标签: javascriptarrays

解决方案


这是因为相同的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"] );


推荐阅读