Javascript: вставить массив в массив с циклом for - PullRequest
7 голосов
/ 25 января 2012

Пожалуйста, объясни мне это.Я пытаюсь создать массив массивов с циклом for.Когда это не сработало, я попытался упростить код, чтобы понять, что делает Javascript, но простой код тоже не имеет смысла.1,2;1,2,3].Вместо этого я получаю [1,2,3;1,2,3;1,2,3].Я получаю такое же явление, если зацикливаю 0-2 и присваиваю по индексу.

Ответы [ 6 ]

16 голосов
/ 25 января 2012

Вы всегда помещаете ссылку на один и тот же массив в свой супер-массив.

Чтобы решить эту проблему, вы можете использовать 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);
}

РЕДАКТИРОВАТЬ: Как справедливо указывает Дэн Д. ниже, вы также можете вызвать concat () без аргументов вместо slice(0).Это быстрее согласно этой статье (я сам ее не измерял):

for (var i = 1; i <= 3; i++) {
    sub_array.push(i);
    super_array.push(sub_array.concat());
}
6 голосов
/ 25 января 2012

Когда вы нажимаете «sub_array», вы не нажимаете копию .Вы получаете один и тот же массив три раза в "super_array".(Я должен сказать, что вы нажимаете ссылку на один и тот же массив три раза.)

Вы можете сделать это:

    // ...
    super_array.push(sub_array.slice(0));

, чтобы сделать копию.

2 голосов
/ 25 января 2012

хорошо.Вы должны понимать, что Array, Objects, Functions и т. Д. Являются ссылками в javascript (только Numbers (Int, Floats и т. Д.) И Strings передаются «по значению», что означает, что значение копируется / дублируется)!если у вас есть var a=[];, скажем var b=a и добавьте b.push("bla"), то при появлении предупреждения a появится запись «bla», даже если вы добавили ее в b.Другими словами;а и б - это javascript, как записка на бритье от мамы, в которой говорится: «Сандвич слева для тебя».И тогда вы знаете, что взять левый, а не какой-нибудь случайный бутерброд из холодильника.Она также могла бы написать еще одну записку (переменная b) на двери вашего дома, чтобы вы знали, куда идти и искать сэндвич, если вы спешите.Если бы она сунула бутерброд к двери ... ну, это было бы неприятно.И JS думает так же об этом:)

, поэтому решение вашей проблемы заключается в следующем:

function test(){
    var super_array =[];
    for (var i=1;i<=3;i++){
        var subarray=[];
        for (var u=1;u<=4-i;u++){
            sub_array.push(u);
            super_array.push(subarray);
        }
    }
    alert(super_array);
}

, переопределив подмассив, вы создаете новую ссылку.Так что переменная b (вторая нота на двери дома) теперь указывает в направлении другого сэндвича - возможно, сэндвича с отцом.

Я надеюсь, что смогу помочь вам понять это.

1 голос
/ 25 января 2012

Обратите внимание, что вы помещаете один и тот же массив в super_array для каждой итерации цикла for.Попробуйте вместо этого следующее:

function test(){
    var sub_array = [];
    var super_array =[];
    for (var i=1;i<=3;i++){
        sub_array = sub_array.slice(0,sub_array.length);
        sub_array.push(i);
        super_array.push(sub_array);
    }
    alert(super_array);
}
0 голосов
/ 25 января 2012

sub_array сохраняется как ссылка в super_array, это означает, что при изменении sub_array изменение отражается внутри super_array

0 голосов
/ 25 января 2012

Это тот же sub_array, который вы добавляете в super_array. Так почему это должно быть по-другому?

Вы не создаете новый массив и не помещаете его в super_array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...