javascript - 更改 Javascript 数组内的对象值

标签 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);

最佳答案

这是因为相同的packet对象被推送到数组中,当您从任何地方更改packet数据时,它都会反射(reflect)在引用的地方。尝试下面,我刚刚删除了对象 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"] );

关于javascript - 更改 Javascript 数组内的对象值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53537501/

相关文章:

javascript - 粘性导航栏需要占用空间

javascript - 编写一个 ruby​​ gem,向 Rails 添加 js 方法

javascript - 使用循环遍历对象中的数组

javascript - 为什么我不能突出显示我当前所在的链接?

javascript - 具有百万、十亿等格式的自动递增计数器(javascript)

javascript - 使用 Razor 参数进行 JQuery Post Ajax 调用

c 编程输入最后一个元素是@

javascript - indexOf 但对于对象呢?

arrays - 将数据打印到 TableView 时出现问题(Swift)

c - 程序的 CPU 使用率突然飙升,看起来像是暂停了