3 Réponses :


5
votes

Vous devez obtenir des références d'objets indépendantes à l'intérieur du tableau, au lieu d'avoir littéralement la valeur constante.

En prenant Array.from avec un objet avec une propriété length et la fonction de mappage de construction, vous pouvez obtenir un tableau de tableaux indépendants.

const tasksArray = Array.from({ length: 3 }, _ => [])
const tasks = ['task1', 'task2']

const fillWithData = (array) => {
  tasks.forEach(task => {
    array[0].push(task)
  })
};

fillWithData(tasksArray);
console.log(tasksArray);


5 commentaires

il suffit d'utiliser Array (3) - {length: 3} est un vaudou et l'utilisation de ce comportement maintient directement l'esprit du programmeur à un niveau qui est moins efficace.


@ user633183, j'aime le vaudou.


@ user633183 Je ne suis pas d'accord. Passer un tableau super basique ne devrait pas être plus vaudou que d'utiliser un unaire + ou !! ou d'autres petites astuces. Je suis assez convaincu qu'à ce stade, il est de plus en plus populaire d'être un idiome comme celui-là, s'il n'est pas déjà atteint.


Oui, mais en tant que développeurs professionnels, nous apprécions également le code qui est simple, maintenable et facile à gérer.


VLAZ, je déconseille fortement + et !! . "Les trucs sont pour les enfants!" . Les vrais programmes démontrent des intentions claires. Utilisez Number.parseInt et Boolean même s'il s'agit de quelques frappes supplémentaires.



2
votes

fill place la valeur que vous lui transmettez à chaque index du tableau.

Ainsi, tasksArray a trois références au même tableau, tandis que tasksArray2 a une référence à chacun des trois tableaux différents.

Si vous voulez y mettre trois tableaux différents, alors vous devez créer explicitement trois tableaux.

Vous pouvez approcher avec un compteur:

const tasksArray2 = [];
let count = 3;
while (count--) {
    tasksArray2.push([]);
}


1 commentaires

Merci, maintenant je comprends que cela était dû à fill () . Cependant, la solution Array.from () semble beaucoup plus propre.



5
votes

Dans taskArray , le [] que vous utilisez est passé comme référence et les éléments de taskArray font tous référence au même tableau.

Dans taskArray2 , vous avez trois tableaux vides séparés, [] , chacun avec sa propre référence. Par conséquent, vous n'obtenez pas de valeurs dupliquées.

Si vous souhaitez créer un tableau de tableaux vides par programmation, utilisez Array.from -

const fillEmptyArrays = (count) =>
  Array.from(Array(count), _ => [])

const tasks =
  fillEmptyArrays(3)

console.log(tasks)
// [ [], [], [] ]

Et veuillez ne pas inclure de noms de type comme Array dans vos noms de variables tasksArray ; nommez-le simplement tâches . JavaScript est un langage typé dynamiquement et ce genre de réflexion vous blesse à long terme.


4 commentaires

cool, j'aime vraiment ça. Pourriez-vous seulement expliquer comment _ peut être compris?


Dandy, dans ce cas, _ est une convention qui signale que le paramètre de la fonction n'est pas utilisé dans le corps de la fonction et n'a donc pas besoin d'un nom; la fonction renvoie toujours [] . Vous pouvez remplacer _ par n'importe quel nom de variable valide et le programme fonctionnera toujours. Voir Array.from 's deuxième argument pour plus de détails.


n'incluez pas de noms de type comme Array dans vos noms de variables ... ce genre de réflexion vous blesse à long terme - Qu'est-ce qui vous fait penser cela?


Les liaisons JavaScript @bob peuvent avoir une valeur de n'importe quel type, et dans le cas de let , le type peut changer avec le temps. Fonctions polymorphes ... Appels de fonctions dynamiques ... rien n'impose que someArray soit un tableau, et dans les cas dynamiques où ce n'est pas un tableau, il est vraiment difficile pour votre cerveau de voir "Array" dans le nom et puis le traiter mentalement comme autre chose.