J'ai lu en ligne et certains endroits disent que ce n'est pas possible, certains le disent, puis donnent un exemple et d'autres réfutent l'exemple, etc.
Comment déclarer un tableau bidimensionnel en JavaScript? (en supposant que c'est possible)
Comment pourrais-je accéder à ses membres? (
myArray[0][1]
oumyArray[0,1]
?)
var arr2D = new Array(5).fill(new Array(3));
, chaque élément de Array (5) pointera vers le même Array (3). Il est donc préférable d'utiliser une boucle for pour remplir dynamiquement les sous-tableaux.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
n'appelle pasnew Array(3)
pour chaque index du tableau à remplir, car ce n'est pas une expression lambda ou quoi que ce soit, comme le commentaire de Longfei Wu ci-dessus, qui remplit initialement le tableau avec 0, puis utilise la fonction de carte avec un lambda pour remplissez chaque élément avec un nouveau tableau. La fonction de remplissage remplit simplement le tableau avec exactement ce que vous lui dites. Cela a-t-il du sens? Pour plus d'informations sur lamap
fonction, voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
Réponses:
la source
Vous transformez simplement chaque élément du tableau en tableau.
la source
new Array(size)
oùsize
est une variable.Semblable à la réponse d'Activa, voici une fonction pour créer un tableau à n dimensions:
la source
var array = createArray(2, 3, 4, 5);
,.[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
Javascript n'a que des tableaux unidimensionnels, mais vous pouvez créer des tableaux de tableaux, comme d'autres l'ont souligné.
La fonction suivante peut être utilisée pour construire un tableau 2D de dimensions fixes:
Le nombre de colonnes n'est pas vraiment important, car il n'est pas nécessaire de spécifier la taille d'un tableau avant de l'utiliser.
Ensuite, vous pouvez simplement appeler:
la source
La façon la plus simple:
la source
myArray[1]=[];
avant d'affectermyArray[1][0]=5;
myArray.length == 1
etmyArray[0].length == 0
. Ce qui donne alors le mauvais résultat si vous copiez ensuite un tableau "réellement vide" "0x0" dedans.Comment créer un tableau bidimensionnel vide (une ligne)
2 et 4 étant respectivement de première et deuxième dimensions.
Nous utilisons
Array.from
, qui peut prendre un paramètre de type tableau et un mappage facultatif pour chacun des éléments.La même astuce peut être utilisée pour créer un tableau JavaScript contenant 1 ... N
Alternativement (mais plus inefficace 12% avec
n = 10,000
)La baisse des performances vient du fait que nous devons avoir les premières valeurs de dimension initialisées pour s'exécuter
.map
. N'oubliezArray
pas que les positions ne seront pas attribuées tant que vous ne les aurez pas commandées par le biais d'.fill
une attribution de valeur directe ou directe.Suivre
Voici une méthode qui semble correcte, mais qui a des problèmes .
Bien qu'il retourne le tableau bidimensionnel apparemment souhaité (
[ [ <4 empty items> ], [ <4 empty items> ] ]
), il y a un crochet: les tableaux de première dimension ont été copiés par référence. Cela signifie qu'unarr[0][0] = 'foo'
changerait en fait deux lignes au lieu d'une.la source
Array.from({length:5}, () => [])
Certains disent que ce n'est pas possible parce qu'un tableau à deux dimensions n'est en réalité qu'un tableau de tableaux. Les autres commentaires ici fournissent des méthodes parfaitement valides pour créer des tableaux bidimensionnels en JavaScript, mais le point de vue le plus pur serait que vous ayez un tableau d'objets unidimensionnel, chacun de ces objets serait un tableau unidimensionnel composé de deux éléments.
C'est donc la cause des points de vue contradictoires.
la source
string[3,5] = "foo";
. C'est une meilleure approche pour certains scénarios, car l'axe Y n'est pas réellement un enfant de l'axe X.Peu de gens montrent l'utilisation de push:
Pour apporter quelque chose de nouveau, je vais vous montrer comment initialiser la matrice avec une valeur, par exemple: 0 ou une chaîne vide "".
Rappelant que si vous avez un tableau de 10 éléments, en javascript le dernier index sera 9!
exemples d'utilisation:
la source
for
(qui définit la valeur par défaut) de votre procédure et j'écrism=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));
- et nous obtenons une matrice très strage (trop imbriquée) - vous la réparez à la dernière étape for-defaultValue, mais je pense que vous pouvez réécrire la procédure pour utiliser des arras moins imbriqués avant définition des valeurs par défaut.Deux doublures:
Il générera un tableau a de la longueur 10, rempli de tableaux. (Push ajoute un élément à un tableau et renvoie la nouvelle longueur)
la source
for (var a=[]; a.push([])<10;);
:?var
marche. Il est toujours fonction de la portée.La réponse la plus saine semble être
Notez que nous ne pouvons pas remplir directement avec les lignes car fill utilise un constructeur de copie peu profond, donc toutes les lignes partageraient la même mémoire ... voici un exemple qui montre comment chaque ligne serait partagée (tirée d'autres réponses):
la source
Array.apply(null, Array(nrows))
mais c'est beaucoup plus élégant.fill
. Cela ne fonctionnera pas sur la majorité des navigateurs.Array(nrows).map(() => 0)
Array(nrows).map(function(){ return 0; });
La façon la plus simple:
la source
Voici ce que j'ai réalisé:
Cela m'a épelé bineeshkumar
la source
appVar[1][4] = "bineesh";
est faux, comment le résoudre?Les tableaux bidimensionnels sont créés de la même manière que les tableaux unidimensionnels. Et vous y accédez comme
array[0][1]
.la source
Je ne sais pas si quelqu'un a répondu à cela, mais j'ai trouvé que cela fonctionnait assez bien pour moi -
par exemple:
Pour un tableau à 2 dimensions, par exemple.
la source
var array = [[],[]]
c'est suffisant.Pour créer un tableau 2D en javaScript, nous pouvons d'abord créer un tableau puis ajouter des tableaux en tant qu'éléments. Cette méthode retournera un tableau 2D avec le nombre donné de lignes et de colonnes.
pour créer un tableau, utilisez cette méthode comme ci-dessous.
la source
Pour créer un tableau "2D" non clairsemé (x, y) avec tous les indices adressables et les valeurs définies sur null:
tableau "3D" bonus (x, y, z)
Des variations et des corrections à ce sujet ont été mentionnées dans les commentaires et à divers points en réponse à cette question, mais pas comme une réponse réelle, donc je l'ajoute ici.
Il convient de noter que (semblable à la plupart des autres réponses), cela a une complexité temporelle O (x * y), donc il ne convient probablement pas aux très grands tableaux.
la source
fill
définissez la même valeur. si le changementnull
en `objet, ce sera le même objet dans chaque colonnelet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
Utiliser les compréhensions de tableau
Dans JavaScript 1.7 et supérieur, vous pouvez utiliser des compréhensions de tableaux pour créer des tableaux à deux dimensions. Vous pouvez également filtrer et / ou manipuler les entrées tout en remplissant le tableau et ne pas avoir à utiliser de boucles.
Vous pouvez créer le
n x m
tableau de votre choix et le remplir avec une valeur par défaut en appelantPlus d'exemples et de documentation peuvent être trouvés ici .
Veuillez noter que ce n'est pas encore une fonctionnalité standard .
la source
for
déclaration est toujours une boucle ...Pour les amateurs de paquebot Array.from ()
Un autre (extrait du commentaire de dmitry_romanov) utilise Array (). Fill ()
Utilisation de l' opérateur de propagation ES6 + ("inspiré" par la réponse InspiredJW :))
la source
0
dans la premièrefill()
fonction:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Mon approche est très similaire à la réponse @Bineesh mais avec une approche plus générale.
Vous pouvez déclarer le double tableau comme suit:
Et le stockage et l'accès au contenu de la manière suivante:
Cela imprimera la sortie attendue
la source
Performance
Aujourd'hui 2020.02.05 j'effectue des tests sur MacOs HighSierra 10.13.6 sur Chrome v79.0, Safari v13.0.4 et Firefox v72.0, pour les solutions choisies.
Conclusions pour le tableau 2D non initialisé
{}/arr[[i,j]]
(N) est la plus rapide pour les grands et les petits tableaux et elle semble être un bon choix pour les grands tableaux clairsemésfor-[]/while
(A, G) sont rapides et constituent un bon choix pour les petites baies.for-[]
(B, C) sont rapides et sont un bon choix pour les grands tableauxArray..map/from/fill
(I, J, K, L, M) sont assez lentes pour les petits tableaux et assez rapides pour les grands tableauxfor-Array(n)
(B, C) est beaucoup plus lent en safari quefor-[]
(A)for-[]
(A) pour les grands tableaux est lent sur tous les navigateursConclusions pour le tableau 2D initialisé
for/while
(A, B, C, D, E, G) sont les plus rapides / assez rapides pour les petits tableaux sur tous les navigateursfor
(A, B, C, E) sont les plus rapides / assez rapides pour les grands tableaux sur tous les navigateursArray..map/from/fill
(I, J, K, L, M) sont moyennes rapides ou lentes pour les petits tableaux sur tous les navigateurs{}/arr[[i,j]]
(N) est la plus lente pour les petits et les grands tableaux sur tous les navigateursDétails
Tester les solutions qui ne remplissent pas (initialiser) le tableau de sortie
Nous testons la vitesse des solutions pour
Afficher l'extrait de code
Test des solutions qui remplissent (initialisent) le tableau de sortie
Nous testons la vitesse des solutions pour
Afficher l'extrait de code
la source
J'ai trouvé ci-dessous le moyen le plus simple:
la source
array1[1][100] = 666;
lancersUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
, vous devez le fairearray1[1] = [];
.Javascript ne prend pas en charge les tableaux bidimensionnels, à la place, nous stockons un tableau dans un autre tableau et récupérons les données de ce tableau en fonction de la position de ce tableau à laquelle vous souhaitez accéder. N'oubliez pas que la numérotation des tableaux commence à ZÉRO .
Exemple de code:
la source
la source
ES6 +, ES2015 + peuvent le faire de manière encore plus simple
Création d'un tableau 3 x 2 rempli de true
la source
J'ai dû créer une fonction de tableau flexible pour y ajouter des «enregistrements» selon mes besoins et pour pouvoir les mettre à jour et effectuer les calculs nécessaires avant de l'envoyer à une base de données pour un traitement ultérieur. Voici le code, j'espère que ça aide :).
N'hésitez pas à optimiser et / ou signaler tout bug :)
la source
aLine.push([clmn1, clmn2, clmn3]);
?Voici un moyen rapide que j'ai trouvé pour créer un tableau à deux dimensions.
Vous pouvez également facilement transformer cette fonction en fonction ES5.
Pourquoi cela fonctionne: le
new Array(n)
constructeur crée un objet avec un prototype deArray.prototype
puis attribue celui-cilength
, résultant en un tableau non peuplé. En raison de son manque de membres réels, nous ne pouvons pas exécuter laArray.prototype.map
fonction dessus.Toutefois, lorsque vous fournissez plusieurs arguments au constructeur, comme lorsque vous le faites
Array(1, 2, 3, 4)
, le constructeur utilisera l'arguments
objet pour instancier et remplirArray
correctement un objet.Pour cette raison, nous pouvons utiliser
Array.apply(null, Array(x))
, car laapply
fonction répartira les arguments dans le constructeur. Par souci de clarté, faireArray.apply(null, Array(3))
équivaut à faireArray(null, null, null)
.Maintenant que nous avons créé un véritable tableau peuplé, tout ce que nous devons faire est d'appeler
map
et de créer la deuxième couche (y
).la source
En dessous, crée une matrice 5x5 et remplissez-les de
null
la source
md[1][0] = 3
et tous les autres éléments sont également mis à jourLes tailles de ligne et de colonne d'un tableau connues uniquement au moment de l' exécution, puis la méthode suivante peut être utilisée pour créer un tableau 2D dynamique .
la source
Il existe une autre solution, qui ne vous oblige pas à prédéfinir la taille du tableau 2D, et qui est très concise.
Cela fonctionne parce que,
[1,2]
est transformé en chaîne, qui est utilisé comme clé de chaîne pour l'table
objet.la source
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pour créer un tableau 4x6, faites simplement ceci
la source