Javascript: push tableau sur tableau avec une boucle for
Veuillez l'expliquer à moi. Je suis en train de créer un tableau de tableaux avec une boucle for. Quand il n'en a pas fonctionné, j'ai essayé de simplifier le code pour comprendre ce que Javascript est fait, mais le simple code n'a pas de sens.
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);
}
Je m'attends à voir [1; 1,2; 1,2,3].
Au lieu de cela je obtenir [1,2,3; 1,2,3; 1,2,3].
Je reçois le même phénomène si je boucle 0-2 et attribuer par l'index.
Vous devez vous connecter pour publier un commentaire.
Vous êtes en poussant toujours une référence à la même matrice dans votre super-tableau.
Pour résoudre ce problème, vous pouvez utiliser slice() de cloner le sous-tableau avant de le pousser:
EDIT: Que Dan D. à juste titre, les points ci-dessous, vous pouvez également appeler concat() sans arguments au lieu de
slice(0)
. C'est plus rapide selon cet article (je n'ai pas de mesurer moi-même):.slice(0)
pour copier le Tableau plutôt que.concat()
? qui peut être plus rapide, mais le profilage j'ai fait, je n'étais pas sûr de.concat()
est plus rapide. Je vais le mentionner dans ma réponse. Merci pour ton commentaire 🙂Lorsque vous appuyez sur "sub_array", vous n'êtes pas en poussant un copie d'elle. Vous vous retrouvez avec le même tableau à trois reprises dans "super_array". (Je devrais dire que vous êtes en poussant un référence de la même matrice à trois reprises.)
Vous pourriez faire ceci:
pour faire une copie.
bien. Vous devez comprendre ce Tableau, les Objets, les Fonctions, etc. sont des références en javascript (uniquement des Chiffres(Int,Flotteurs,etc) et les Chaînes de caractères sont transmis "par valeur", ce qui signifie que la valeur est copié, dupliqué)!
si vous avez un
var a=[];
, und direvar b=a
et ajouterb.push("bla")
, puis avertir un, va vous montrer la "bla" entrée, même si vous l'avez ajouté à b.En d'autres termes; a et b est de javascript comme une note sur le frigo de maman en disant: "le sandwhich sur la gauche est pour vous." Et puis vous savez que, pour prendre à gauche et pas n'importe aléatoire sandwich dans le frigo. Elle aussi a écrit une autre note (variable b) sur votre " maison de la porte, de sorte que vous ne savaient plus où aller et regarder pour le sandwich si vous êtes pressé.
Si elle aurait collé un sandwich à la porte.. et bien c'est ackward. Et JS pense la même chose à ce sujet 🙂
donc la solution à votre problème est que les jachères;
par la redéfinition de la subarray, vous créez une nouvelle référence. De sorte que la variable b (deuxième note sur la hous' porte) maintenant pointe dans la direction d'un autre sandwich - peut-être que papa sandwich.
J'espère que je pourrais vous aider à comprendre cela.
Noter que vous poussez le même tableau dans super_array pour chaque itération de la boucle for. Essayez plutôt la suivante:
Il en est de même de sub_array que vous ajoutez à la super_array. Alors pourquoi il doit être différente.
Vous n'êtes pas de la création d'un nouveau tableau et en poussant un super_array.
sub_array
est stocké comme une référence danssuper_array
cela signifie que lorsque vous changez desub_array
le changement est reflété à l'intérieur desuper_array