我是Javascript的菜鸟。我意外地将for循环中生成的数组保存到全局数组中。全局数组最终仅填充for循环的最后一次迭代中保存的最后一项。我花了一天时间试图解决这个问题并对其进行研究,但我已经饱和并难倒了。
这是我问题的简单抽象。
var arrays = [];
var array = [];
//I want the 'array' '0' and '2' elements to stay the same
array[0] = "a";
array[2] = 'b';
for(i=0; i<3; i++){
//i'd like to change the array[1] element in the loop
array[1] = i;
//and accumulate the changed 'array' from each loop iteration in 'arrays'
arrays.push(array);
console.log(array);
}//end for
console.log(arrays);
输出的是:
[a, 0, b]
[a, 1, b]
[a, 2, b]
[[a, 0, b,], [a, 0, b], [a, 0, b]]
我想要和期望的是:
[a, 0, b]
[a, 1, b]
[a, 2, b]
[[a, 1, b,], [a, 2, b], [a, 3, b]]
我不明白为什么&#39;阵列&#39;只填充for循环的最后一个数组?如何累积已更改的数组&#39;在for循环的每次迭代中?
我显然没有理解基本的东西,但我现在已经饱和了。谢谢你的建议。
更新:谢谢大家! - 我现在明白我正在推动对阵列的引用。到阵列&#39;。它每次推送相同的参考,所以&#39;阵列的所有元素&#39;将只是最新的阵列&#39;。我需要将一个新数组推送到数组&#39;与.slice()。我也纠正了原帖中的错误。阵列[2] =&#39; C&#39;应该是数组[2] =&#39; b&#39;。感谢
答案 0 :(得分:1)
Javascript中的对象通过引用传递。
你正在推动同一个阵列实例3次。
您需要在每次迭代中创建一个新数组 特别是,您可能希望复制现有的:
array = array.slice();
答案 1 :(得分:0)
引用指针是个问题。使用slice();检查此代码
var arrays = [];
var array = [];
//I want the 'array' '0' and '2' elements to stay the same
array[0] = "a";
array[2] = 'c';
for(i=0; i<3; i++){
var newarray = array.slice();;
newarray[1] = i;
arrays.push( newarray);
}
console.log(arrays);
&#13;
答案 2 :(得分:0)
您正在使用对初始数组的引用,因此最终数组中的所有值都使用初始数组的最终值进行更新。使用Slice()创建数组的浅表副本。以下是完整的解释:
#panier_container
&#13;