javascript - 将for循环中的数组推送到空的全局数组 - 用最后推送的项填充全局?

时间:2017-04-20 18:42:49

标签: javascript arrays

我是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;。感谢

3 个答案:

答案 0 :(得分:1)

Javascript中的对象通过引用传递。

你正在推动同一个阵列实例3次。

您需要在每次迭代中创建一个新数组 特别是,您可能希望复制现有的:

array = array.slice();

答案 1 :(得分:0)

引用指针是个问题。使用slice();检查此代码

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

您正在使用对初始数组的引用,因此最终数组中的所有值都使用初始数组的最终值进行更新。使用Slice()创建数组的浅表副本。以下是完整的解释:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice?v=control

&#13;
&#13;
#panier_container
&#13;
&#13;
&#13;