Javascript:使用for循环将数组推送到数组

Eri*_*eld 7 javascript arrays loops for-loop

请向我解释一下.我正在尝试使用for循环创建一个数组数组.当它不起作用时,我尝试简化代码以了解Javascript正在做什么,但简单的代码也没有意义.

function test(){
    var sub_array = [];
    var super_array =[];
    for (var i=1;i<=3;i++){
        sub_array.push(i);
        super_array.push(sub_array);
    }
    alert(super_array);
}
Run Code Online (Sandbox Code Playgroud)

我希望看到[1; 1,2; 1,2,3].取而代之的是[1,2,3; 1,2,3; 1,2,3].如果我循环0-2并按索引分配,我会得到相同的现象.

Fré*_*idi 16

您总是将对同一数组的引用推送到超级数组中.

要解决该问题,可以在推送之前使用slice()克隆子数组:

function test() {
    var sub_array = [];
    var super_array = [];
    for (var i = 1; i <= 3; i++) {
        sub_array.push(i);
        super_array.push(sub_array.slice(0));
    }
    alert(super_array);
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如Dan D.在下面指出的那样,你也可以不用参数调用concat()而不是slice(0).根据这篇文章它更快(我没有自己衡量):

for (var i = 1; i <= 3; i++) {
    sub_array.push(i);
    super_array.push(sub_array.concat());
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么你选择使用`.slice(0)`复制数组而不是`.concat()`?这可能会更快,但我做的分析我不确定. (2认同)

Poi*_*nty 6

当您按下"sub_array"时,您不会推送它的副本.您最终在"super_array"中使用相同的数组三次.(我应该说你正在推动对同一阵列的引用三次.)

你可以这样做:

    // ...
    super_array.push(sub_array.slice(0));
Run Code Online (Sandbox Code Playgroud)

制作副本.