2017-10-16 2 views
2

Trouble with New tableau généré des tableaux de la matrice

let arr = [[1,2,3], [4,5,6], [7,8,9]] 
 
arr[0][1] = 'X' 
 
arr[1][1] = 'O' 
 

 
console.log(arr);

Je suis en train de travailler sur un jeu tic-tac-toe préliminaire et cette méthode pour créer la table me sert bien.

À la lecture sur d'autres méthodes pour générer une table de réseau matriciel J'ai trouvé ce

let newArr = new Array(3).fill(new Array(3)) 
 
newArr[0][1] = 'X' 
 

 
console.log(newArr)

Comme je tente de revenir newArr il remplace en fait la colonne entière avec « X ».

Pourquoi cela fait-il cela? Je pensais que peut-être, au cours de la pile, j'ai reconnu la valeur d'un index indéfini et que je préférais faire la même chose pour toute la colonne, mais je ne peux pas confirmer.

+0

Et d'expliquer pourquoi, 'array.fill' attend 1 argument et il va remplir le tableau avec cet élément. Maintenant, les objets sont copiés par référence, donc quand vous lui passez un objet/tableau, vous remplissez toutes les valeurs dans un tableau avec la même référence. Par conséquent, la mise à jour de la valeur 1 met à jour toutes les valeurs. – Rajesh

+0

Merci beaucoup, c'est tout à fait logique. Certainement pas pratique d'appliquer Array.fill avec le même objet de référence. – jondub

+0

Une alternative peut être 'Array.from ({longueur: 3}, (x) => new Array (3))', mais il s'agit d'une fonctionnalité ES6. Travaillerait pour vous mais l'utiliserait à vos risques et périls – Rajesh

Répondre

1

Array#fill prend un objet/primitive et l'utilise pour remplir tous les éléments. Vous avez donné un tableau dans la fonction, array est un type de référence, donc il utilise la même référence pour tous les éléments, mais l'objet est unique. Alors pourquoi vous êtes mis à jour pour toutes les colonnes.

Vous pouvez comparer les références pour vous assurer que single est créé et utilisé pour tous les éléments.

let newArr = new Array(2).fill(new Array(2)); 
 

 
console.log(newArr[0] === newArr[1]);

Pour créer un tableau comme vous le souhaitez, vous pouvez faire

let newArr = Array.from({ length: 3 },() => new Array(3)); 
 

 
newArr[0][1] = 'X'; 
 

 
console.log(newArr);

+0

Le deuxième argument pour 'array.from' est une fonction de carte. Donc, vous pouvez directement faire 'Array.from ({longueur: 3},() => nouveau tableau (3))' – Rajesh

+0

@Rajesh Merci. Édité –