Comment créer un tableau bidimensionnel en JavaScript?

1137

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.

  1. Comment déclarer un tableau bidimensionnel en JavaScript? (en supposant que c'est possible)

  2. Comment pourrais-je accéder à ses membres? ( myArray[0][1]ou myArray[0,1]?)

Diego
la source
21
En supposant une définition quelque peu pédante, il est techniquement impossible de créer un tableau 2D en javascript. Mais vous pouvez créer un tableau de tableaux, ce qui revient au même.
IJ Kennedy
10
FYI ... lorsque vous remplissez un tableau avec plus de tableaux en utilisant 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.
Josh Stribling
51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu
2
En d'autres termes, filln'appelle pas new 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 la mapfonction, voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling
2
@kalehmann ça va: meta.stackoverflow.com/a/252017/2311074 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.
Adam

Réponses:

1232

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);

Ballsacian1
la source
32
Il serait difficile d'initialiser un grand tableau multidimensionnel de cette façon. Cependant, cette fonction peut être utilisée pour créer un multidimensionnel vide, avec les dimensions spécifiées comme paramètres.
Anderson Green
2
@AndersonGreen C'est une bonne chose que vous ayez mentionné un lien pour ceux qui s'intéressent à la solution de baie multi-D, mais la question et la réponse de Ballsacian1 concernent la baie "2D", pas la baie "multi-D"
evilReiko
Vous devriez parcourir tout cela ... par exemple, alert (items [0] [1]); // 2 etc.
Dois
1
@SashikaXP, cela ne fonctionne pas pour les premiers indices autres que 0.
Michael Franzl
1
La question est de savoir comment déclarer un tableau à deux dimensions. C'est ce que je cherchais et j'ai trouvé ceci et les réponses suivantes qui ne parviennent pas à discerner la différence entre déclarer et initialiser. Il y a aussi une déclaration de longueur connue ou illimitée, dont aucune n'est discutée.
chris
444

Vous transformez simplement chaque élément du tableau en tableau.

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);

Sufian
la source
6
Peuvent-ils utiliser des éléments comme des chaînes pour leurs clés et leurs valeurs? myArray ['Book'] ['item1']?
Diego
42
@Diego, oui, mais ce n'est pas à cela que les tableaux sont destinés. Il est préférable d'utiliser un objet lorsque vos clés sont des chaînes.
Matthew Crumley
10
J'aime mieux cet exemple que la réponse acceptée car cela peut être implémenté pour des tableaux de taille dynamique, par exemple new Array(size)sizeest une variable.
Variadicism
1
ne fonctionne pas - erreur sur l'affectation. Comment cette réponse a-t-elle obtenu 280 likes si elle est inutile?
Gargo
1
Cela fonctionne, merci. Vous pouvez voir l'exemple Gargo jsfiddle.net/matasoy/oetw73sj
matasoy
198

Semblable à la réponse d'Activa, voici une fonction pour créer un tableau à n dimensions:

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]
Matthew Crumley
la source
2
Cela peut-il créer un tableau à 4 dimensions?
trusktr
4
@trusktr: Oui, vous pouvez créer autant de dimensions que vous le souhaitez (dans les limites de votre mémoire). Il suffit de passer dans la longueur des quatre dimensions. Par exemple var array = createArray(2, 3, 4, 5);,.
Matthew Crumley
4
Meilleure réponse ! Cependant, je ne recommanderais pas de l'utiliser avec 0 ou 1 paramètres (inutile)
Apolo
2
@BritishDeveloper Oui. Ceci est un tableau 5D avec chaque longueur à 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]]]]]
haykam
2
@haykam désolé de perdre votre temps - j'étais sarcastique: /
BritishDeveloper
84

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:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

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:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...
Philippe Leybaert
la source
je veux faire un tableau à 2 dim qui représenterait un jeu de cartes. Ce serait un tableau à 2 dim qui contient la valeur de la carte, puis la combinaison. Quelle serait la façon la plus simple de procéder?
Doug Hauf
1
fonction Create2DArray (lignes) {var arr = []; for (var i = 0; i <lignes; i ++) {arr [i] = []; } return arr; } fonction print (deck) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} fucntion fillDeck (d) {for (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; pour (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} fonction loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); imprimer (myCardDeck); }
Doug Hauf
2
@Doug: Vous voulez en fait un tableau d'objets unidimensionnel avec 2 attributs. var deck = []; deck [0] = {face: 1, costume: 'H'};
TeasingDart
@DougHauf c'est un tableau 2D minifié ?? : P: D
Mahi
78

La façon la plus simple:

var myArray = [[]];
Fred
la source
29
qui est un tableau à 2 dimensions
Maurizio In denmark
15
Ouais, fais attention à ça. Affecter myArray [0] [quel que soit] est correct, mais essayez de définir myArray [1] [peu importe] et il se plaint que myArray [1] n'est pas défini.
Philip
22
@Philip vous devez définir myArray[1]=[];avant d'affectermyArray[1][0]=5;
182764125216
4
Soyez conscient, cela ne pas « créer un tableau vide 1x1 » comme l' a écrit @AndersonGreen. Il crée un tableau "1x0" (c'est-à-dire 1 ligne contenant un tableau avec 0 colonnes). myArray.length == 1et myArray[0].length == 0. Ce qui donne alors le mauvais résultat si vous copiez ensuite un tableau "réellement vide" "0x0" dedans.
JonBrave
3
@ 182764125216 c'était la connaissance du jour pour moi. Merci :)
th3pirat3
76

Comment créer un tableau bidimensionnel vide (une ligne)

Array.from(Array(2), () => new Array(4))

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.

Array.from (arrayLike [, mapFn [, thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

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)

Array(2).fill(null).map(() => Array(4))

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'oubliez Arraypas que les positions ne seront pas attribuées tant que vous ne les aurez pas commandées par le biais d' .fillune attribution de valeur directe ou directe.

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


Suivre

Voici une méthode qui semble correcte, mais qui a des problèmes .

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

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'un arr[0][0] = 'foo'changerait en fait deux lignes au lieu d'une.

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);

zurfyx
la source
Je suggère ceci:Array.from({length:5}, () => [])
vsync
Subjectif ici, mais cette réponse (la première et la seconde en son sein) semble être le meilleur équilibre entre succinct, rapide et moderne.
Brady Dowling
@zurfyx une idée, ou quelqu'un sait-il pourquoi Webstorm s'en plaint? Il semble que array.from continue de laisser des valeurs indéfinies, puis je ne peux pas travailler avec le tableau créé, même si l'extrait de
code fonctionne correctement
46

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.

James Conigliaro
la source
42
Non ce n'est pas. Dans certaines langues, vous pouvez avoir des tableaux multidimensionnels comme 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.
Rafael Soares
3
Une fois arrivé au code machine sous-jacent, tous les tenseurs de dimension> 1 sont des tableaux de tableaux, quel que soit le langage dont nous parlons. Il convient de garder cela à l'esprit pour des raisons d'optimisation du cache. Tout langage décent qui s'adresse sérieusement à l'informatique numérique vous permettra d'aligner votre structure multidimensionnelle en mémoire de sorte que votre dimension la plus utilisée soit stockée de manière contiguë. Le Numpy, le Fortran et le C de Python me viennent à l'esprit. En effet, il existe des cas où il vaut la peine de réduire la dimensionnalité en plusieurs structures pour cette raison.
Thomas Browne
Les ordinateurs n'ont aucune notion de dimensions. Il n'y a qu'une seule dimension, l'adresse mémoire. Tout le reste est une décoration de notation au profit du programmeur.
TeasingDart
3
@ThomasBrowne Pas exactement. Les "tableaux de tableaux" nécessitent un certain stockage pour les tailles des tableaux internes (ils peuvent différer) et un autre déréférencement de pointeur pour trouver l'endroit où un tableau interne est stocké. Dans tout langage "décent", les tableaux multidimentionnels diffèrent des tableaux irréguliers, car ce sont des structures de données différentes en soi. (Et la partie déroutante est que les tableaux C sont multidimentionnels, même s'ils sont indexés avec la syntaxe [a] [b].)
polkovnikov.ph
33

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!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

exemples d'utilisation:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0
Sergio Abreu
la source
Je supprime le dernier for(qui définit la valeur par défaut) de votre procédure et j'écris m=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.
Kamil Kiełczewski
27

Deux doublures:

var a = []; 
while(a.push([]) < 10);

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)

domenukk
la source
13
Une ligne for (var a=[]; a.push([])<10;);:?
Bergi
@Bergi la variable a sera-t-elle toujours définie dans la ligne suivante ..?
StinkyCat
1
@StinkyCat: Oui, c'est comme ça que ça varmarche. Il est toujours fonction de la portée.
Bergi
Je sais, donc votre one-liner est inutile dans ce cas: vous ne pouvez pas "accéder à ses membres" (vérifier la question)
StinkyCat
1
domenukk et @Bergi, vous avez tous les deux raison. Je l'ai essayé et je peux accéder à un après le for. Je m'excuse! et merci, que ce soit une leçon pour moi;)
StinkyCat
24

La réponse la plus saine semble être

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);


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):

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);
Francesco Dondi
la source
Cela devrait être tout en haut. J'ai fait quelque chose de similaire en utilisant Array.apply(null, Array(nrows))mais c'est beaucoup plus élégant.
dimiguel
À cet égard, mon dernier commentaire ... Internet Explorer et Opera ne prennent pas en charge fill. Cela ne fonctionnera pas sur la majorité des navigateurs.
dimiguel
@dimgl Fill peut être émulé dans ce cas avec une carte constante Array(nrows).map(() => 0)Array(nrows).map(function(){ return 0; });
Conor O'Brien
20

La façon la plus simple:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'
Chicharito
la source
18

Voici ce que j'ai réalisé:

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

Cela m'a épelé bineeshkumar

Bineesh
la source
2
Remarquez comment vous ne pouvez accéder qu'à l'index 0 du tableau parent. Ce n'est pas aussi utile que quelque chose qui vous permet de définir, par exemple, appVar [5] [9] = 10; ... vous obtiendrez 'Impossible de définir la propriété "9" d'undefined' avec ceci.
RaisinBranCrunch
Mais appVar[1][4] = "bineesh";est faux, comment le résoudre?
Gank
16

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].

var arr = [1, 2, [3, 4], 5];

alert (arr[2][1]); //alerts "4"
TJ L
la source
14

Je ne sais pas si quelqu'un a répondu à cela, mais j'ai trouvé que cela fonctionnait assez bien pour moi -

var array = [[,],[,]]

par exemple:

var a = [[1,2],[3,4]]

Pour un tableau à 2 dimensions, par exemple.

Uchenna
la source
Comment puis-je faire cela dynamiquement? Je veux les tableaux intérieurs de différentes tailles.
alap
3
Vous n'avez pas besoin de virgules supplémentaires, var array = [[],[]]c'est suffisant.
Kaya Toast
13

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.

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

pour créer un tableau, utilisez cette méthode comme ci-dessous.

var array = Create2DArray(10,20);
premier
la source
2
Veuillez ajouter des informations explicatives à votre réponse montrant comment cela fonctionne et pourquoi cela résout le problème. Cela aidera ceux qui trouveront cette page à l'avenir
Our Man in Bananas
Quand auriez-vous besoin d'un tableau préinitialisé avec un certain nombre de colonnes en Javascript? Vous pouvez également accéder au n-ième élément d'un tableau [].
domenukk
J'ai remarqué que la fonction commence par C majuscule, qui (selon certaines conventions) suggère que ce serait un constructeur de fonction et que vous l'utiliseriez avec le nouveau mot clé. Un très mineur et quelque peu opiniâtre peut-être, mais je suggérerais quand même un mot sans majuscule.
Hachi
12

Pour créer un tableau "2D" non clairsemé (x, y) avec tous les indices adressables et les valeurs définies sur null:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

tableau "3D" bonus (x, y, z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

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.

Justin Ohms
la source
1
soyez prudent car filldéfinissez la même valeur. si le changement nullen `objet, ce sera le même objet dans chaque colonne
Stanislav Mayorov
@StanislavMayorov Si vous souhaitez définir la valeur de chaque cellule, utilisez simplement la même astuce:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam
10

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.

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

Vous pouvez créer le n x mtableau de votre choix et le remplir avec une valeur par défaut en appelant

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

Plus d'exemples et de documentation peuvent être trouvés ici .

Veuillez noter que ce n'est pas encore une fonctionnalité standard .

Tim Hallyburton
la source
Un rapide contrôle google ici ... ouais ... la fordéclaration est toujours une boucle ...
Pimp Trizkit
1
Il n'est pris en charge par aucun navigateur - ICI ?
Kamil Kiełczewski
10

Pour les amateurs de paquebot Array.from ()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

Un autre (extrait du commentaire de dmitry_romanov) utilise Array (). Fill ()

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

Utilisation de l' opérateur de propagation ES6 + ("inspiré" par la réponse InspiredJW :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))
mon-
la source
2
nous pouvons supprimer 0dans la première fill()fonction:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li
8

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:

var myDoubleArray = [[]];

Et le stockage et l'accès au contenu de la manière suivante:

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

Cela imprimera la sortie attendue

[ 9, 8 ] 9 123
Alexandre
la source
8

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é

  • solution ésotérique {}/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és
  • solutions basées sur for-[]/while (A, G) sont rapides et constituent un bon choix pour les petites baies.
  • solutions for-[] (B, C) sont rapides et sont un bon choix pour les grands tableaux
  • solutions basées sur Array..map/from/fill (I, J, K, L, M) sont assez lentes pour les petits tableaux et assez rapides pour les grands tableaux
  • étonnamment for-Array(n)(B, C) est beaucoup plus lent en safari que for-[](A)
  • étonnamment for-[](A) pour les grands tableaux est lent sur tous les navigateurs
  • solutions K est lent pour les petits tableaux pour tous les navigateurs
  • les solutions A, E, G sont lentes pour les grands tableaux pour tous les navigateurs
  • la solution M est la plus lente pour tous les tableaux sur tous les navigateurs

entrez la description de l'image ici

Conclusions pour le tableau 2D initialisé

  • les solutions basées sur for/while(A, B, C, D, E, G) sont les plus rapides / assez rapides pour les petits tableaux sur tous les navigateurs
  • les solutions basées sur for(A, B, C, E) sont les plus rapides / assez rapides pour les grands tableaux sur tous les navigateurs
  • les solutions basées sur Array..map/from/fill(I, J, K, L, M) sont moyennes rapides ou lentes pour les petits tableaux sur tous les navigateurs
  • les solutions F, G, H, I, J, K, L pour les grands tableaux sont moyennes ou rapides sur chrome et safari mais les plus lentes sur firefox.
  • la solution ésotérique {}/arr[[i,j]](N) est la plus lente pour les petits et les grands tableaux sur tous les navigateurs

entrez la description de l'image ici

Détails

Tester les solutions qui ne remplissent pas (initialiser) le tableau de sortie

Nous testons la vitesse des solutions pour

  • petits tableaux (12 éléments) - vous pouvez effectuer des tests sur votre machine ICI
  • grands tableaux (1 million d'éléments) tableaux - vous pouvez effectuer des tests sur votre machine ICI

Test des solutions qui remplissent (initialisent) le tableau de sortie

Nous testons la vitesse des solutions pour

  • petits tableaux (12 éléments) - vous pouvez effectuer des tests sur votre machine ICI
  • grands tableaux (1 million d'éléments) tableaux - vous pouvez effectuer des tests sur votre machine ICI

entrez la description de l'image ici

Kamil Kiełczewski
la source
7

J'ai trouvé ci-dessous le moyen le plus simple:

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);
GMsoF
la source
array1[1][100] = 666;lancersUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski
@ KamilKiełczewski vous avez raison, on dirait que cela ne démarre que pour le premier tableau de tableau, pour le second avant de le faire array1[1][100] = 666;, vous devez le faire array1[1] = [];.
GMsoF
6

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:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array
Meule
la source
6

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML;
  listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);

antelove
la source
6

ES6 +, ES2015 + peuvent le faire de manière encore plus simple


Création d'un tableau 3 x 2 rempli de true

[...Array(3)].map(item => Array(2).fill(true))
jwchang
la source
Je dois avouer. J'ai "adopté" votre réponse et ajouté à la mienne , la collection de monoplaces.
my-
5

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 :).

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

N'hésitez pas à optimiser et / ou signaler tout bug :)

CJ Mendes
la source
Et juste aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit
5

Voici un moyen rapide que j'ai trouvé pour créer un tableau à deux dimensions.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

Vous pouvez également facilement transformer cette fonction en fonction ES5.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

Pourquoi cela fonctionne: le new Array(n)constructeur crée un objet avec un prototype de Array.prototypepuis attribue celui-ci length, résultant en un tableau non peuplé. En raison de son manque de membres réels, nous ne pouvons pas exécuter la Array.prototype.mapfonction dessus.

Toutefois, lorsque vous fournissez plusieurs arguments au constructeur, comme lorsque vous le faites Array(1, 2, 3, 4), le constructeur utilisera l' argumentsobjet pour instancier et remplir Arraycorrectement un objet.

Pour cette raison, nous pouvons utiliser Array.apply(null, Array(x)), car la applyfonction répartira les arguments dans le constructeur. Par souci de clarté, faire Array.apply(null, Array(3))équivaut à faire Array(null, null, null).

Maintenant que nous avons créé un véritable tableau peuplé, tout ce que nous devons faire est d'appeler mapet de créer la deuxième couche ( y).

dimiguel
la source
5

En dessous, crée une matrice 5x5 et remplissez-les de null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);

ouais
la source
3
Cette réponse est fausse. Il créera un tableau avec le même tableau remplissant ses emplacements. md[1][0] = 3 et tous les autres éléments sont également mis à jour
Qiang
5

Les 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 .

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6
SridharKritha
la source
4

Il existe une autre solution, qui ne vous oblige pas à prédéfinir la taille du tableau 2D, et qui est très concise.

var table = {}
table[[1,2]] = 3 // Notice the double [[ and ]]
console.log(table[[1,2]]) // -> 3

Cela fonctionne parce que, [1,2]est transformé en chaîne, qui est utilisé comme clé de chaîne pour l' tableobjet.

Oli
la source
Cette réponse seule ne me donne pas envie de jouer avec les ordures qui sont des tableaux "multidimensionnels" en JavaScript, même si j'ai une solution très élégante. Cela montre également que tout le monde ne fait pas du tout de tableaux multidimensionnels. un "tableau" en JavaScript; cette réponse «simulera» complètement un tableau de dimensions pseudo-infinies, de tailles et de contenus arbitraires. la vitesse sera un problème majeur pour ces structures plus grandes.
Pimp Trizkit
Utilisez plutôt cette ligne pour simuler le pré-remplissage:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit
Belle façon créative d'émuler Array2D par objet :)
Kamil Kiełczewski
4

Pour créer un tableau 4x6, faites simplement ceci

const x = [...Array(6)].map(elem => new Array(4))
client
la source