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