webentwicklung-frage-antwort-db.com.de

Javascript: Array mit for-Schleife in Array schieben

Bitte erkläre mir das. Ich versuche, ein Array von Arrays mit einer for-Schleife zu erstellen. Wenn es nicht funktioniert hat, habe ich versucht, den Code zu vereinfachen, um zu verstehen, was Javascript tut, aber der einfache Code macht auch keinen Sinn.

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);
}

Ich erwarte, [1; 1,2; 1,2,3]. Stattdessen bekomme ich [1,2,3; 1,2,3; 1,2,3]. Ich bekomme das gleiche Phänomen, wenn ich 0-2 schleife und nach Index zuordne.

8

Sie übertragen immer einen Verweis auf dasselbe Array in Ihr Super-Array.

Um dieses Problem zu lösen, können Sie das Sub-Array mit slice () klonen, bevor Sie es verschieben:

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);
}

EDIT: Wie Dan D. unten zu Recht ausführt, können Sie anstelle von slice(0) auch concat () ohne Argumente aufrufen. Es ist schneller laut diesem Artikel (ich habe es nicht selbst gemessen):

for (var i = 1; i <= 3; i++) {
    sub_array.Push(i);
    super_array.Push(sub_array.concat());
}
15

Wenn Sie "sub_array" drücken, drücken Sie keine Kopie davon. In "super_array" landen Sie dreimal mit demselben Array. (Ich sollte sagen, dass Sie dreimal einen Verweis auf dasselbe Array verschieben.)

Sie könnten dies tun:

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

eine Kopie machen.

6
Pointy

gut. Sie müssen verstehen, dass Array, Objekte, Funktionen usw. Referenzen in Javascript sind (nur Zahlen (Int, Floats usw.) und Strings werden als "By-Value" übergeben, dh der Wert wird kopiert/dupliziert)! Wenn Sie einen var a=[]; haben und var b=a sagen und b.Push("bla") hinzufügen, wird bei der Benachrichtigung von a der "bla" -Eintrag angezeigt, obwohl Sie ihn zu b hinzugefügt haben. Mit anderen Worten; a und b ist zu Javascript wie eine Notiz auf der Frige von Mama, die sagt "der Sand, der auf der linken Seite ist, ist für dich." Und dann weißt du, dass man das linke und nicht irgendein zufälliges Sandwich aus dem Kühlschrank nimmt. Sie hätte auch eine weitere Notiz (Variable b) an Ihre Haustür schreiben können, damit Sie wussten, wohin Sie gehen und nach dem Sandwich suchen sollten, wenn Sie es eilig haben. Wenn sie ein Sandwich an die Tür geklebt hätte ... nun, das wäre unangenehm. Und JS denkt das auch :)

die Lösung für Ihr Problem sind also Brachen.

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);
}

indem Sie das Subarray neu definieren, erstellen Sie eine neue Referenz. So dass die Variable b (die zweite Note an der Haustür) jetzt in die Richtung eines anderen Sandwichs zeigt - vielleicht des Vaters Sandwich.

Ich hoffe, ich konnte Ihnen helfen, dies zu verstehen.

2
japrescott

Beachten Sie, dass Sie für jede Iteration in der for-Schleife dasselbe Array in super_array verschieben. Versuchen Sie stattdessen Folgendes:

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);
}
1

Es ist dasselbe sub_array, das Sie zum super_array hinzufügen. Also warum muss es anders sein.

Sie erstellen kein neues Array und verschieben es in ein super_array.

0

sub_array wird als Referenz in super_array gespeichert, dh wenn Sie sub_array ändern, wird die Änderung in super_array wiedergegeben.

0
James Wiseman