Tableau trié changeant curent et ancien variable

JS Source:

var c1 = ["Saab", "Volvo", "BMW"]; var c2=c1; c1.sort(); document.getElementById("demo").innerHTML = '1 -> '+c1+'<br>2 -> '+c2; 

RÉSULTAT: 1 -> BMW, Saab, Volvo 2 -> BMW, Saab, Volvo

Je dois être: 1 -> BMW, Saab, Volvo 2 -> Saab, Volvo, BMW

Quand tu dis

 var c2=c1; 

Vous faites réellement c2 point sur le même objet référencé par c1 . Ensuite, vous modifiez l'objet Array c1 . Puisque c2 et c1 renvoient le même objet, c1 et c2 imprimeront le même objet.

Vous devez faire une copie de l'objet Array. Vous pouvez utiliser c1.slice() pour faire cela, comme ça

 var c2 = c1.slice(); 

Maintenant c2 réfère à une copie du tableau c1 . Ainsi, les modifications apportées au c1 n'affecteront pas l'objet c2 .

La ligne:

 var c2=c1; 

… ne crée pas une copie du tableau, il crée une deuxième référence au même objet de tableau sous-jacent. Ainsi, les modifications que vous effectuez via l'une ou l'autre variable affecteront le même tableau, que ce soit le tri, l'ajout d'éléments ou autre.

Heureusement, il est facile de créer une copie d'un tableau:

 var c2 = c1.slice(); 

La méthode .slice() renvoie une copie d'une partie d'un tableau ou, si vous l'appelez sans arguments (ou avec juste un index de début de 0 ), il copie l'ensemble du tableau. Alors, les variables c1 et c2 se référeront à deux tableaux différents et vous pouvez trier ou modifier un autre sans changer l'autre.

Utilisez simplement une tranche (0):

 var c1 = ["Saab", "Volvo", "BMW"]; var c2=c1.slice(0); c1.sort(); alert(c1); alert(c2); 

Voici un exemple:

http://jsfiddle.net/c3161930/

Cordialement, Felipe