J'essaye de créer un tableau qui a une longueur définie et de le remplir avec des tableaux vides. J'ai essayé d'utiliser toutes les possibilités offertes par la réponse de @ stpoa ici a > mais mon tableau ne se comporte pas correctement. Compte tenu du code (je l'ai simplifié à titre d'exemple): Me donne une sortie incorrecte pour fillWithData(tasksArray) // [['task1', 'task2'], ['task1', 'task2'], ['task1', 'task2']] => not OK, duplicates values!
fillWithData(tasksArray2) // [['task1', 'task2'], [], []] => that's OK
tasksArray
et un évidemment correct pour tasksArray2
qui est codé en dur const tasksArray = Array(3).fill([])
const tasksArray2 = [[], [], []]
const tasks = ['task1', 'task2']
const fillWithData = (array) => {
tasks.forEach(task => {
array[0].push(task)
})
}
3 Réponses :
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);
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.
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([]); }
Merci, maintenant je comprends que cela était dû à fill ()
. Cependant, la solution Array.from ()
semble beaucoup plus propre.
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.
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.
Quelle est l'attente de production?
un deuxième, peut-être que je le marquerai plus visiblement;)
Copie possible de Comportement étrange d'un tableau rempli par Array. prototype.fill () et Comportement inattendu lors de l'utilisation de Array Map sur un tableau initialisé avec Array Fill et Créer un tableau 2D à l'aide du nouveau bogue Array (). fill (0)?