Come posso creare un array bidimensionale in JavaScript?


1136

Ho letto online e alcuni posti dicono che non è possibile, alcuni lo dicono e poi danno un esempio e altri confutano l'esempio, ecc.

  1. Come posso dichiarare un array bidimensionale in JavaScript? (supponendo che sia possibile)

  2. Come accederei ai suoi membri? ( myArray[0][1]o myArray[0,1]?)


21
Supponendo una definizione in qualche modo pedante, è tecnicamente impossibile creare un array 2d in javascript. Ma puoi creare una serie di array, il che equivale allo stesso.
IJ Kennedy,

10
FYI ... quando si riempie un array con più array usando var arr2D = new Array(5).fill(new Array(3));, ogni elemento di Array (5) punterà allo stesso Array (3). Quindi è meglio usare un ciclo for per popolare dinamicamente i sotto array.
Josh Stribling,

51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu,

2
In altre parole, fillnon richiede new Array(3)che ogni indice dell'array venga riempito, poiché non è un'espressione lambda o altro, come il commento di Longfei Wu sopra, che inizialmente riempie l'array con 0, quindi utilizza la funzione map con un lambda per riempire ogni elemento con un nuovo array. La funzione di riempimento riempie semplicemente l'array con esattamente ciò a cui lo dici. Ha senso? Per ulteriori informazioni sulla mapfunzione, vedere: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling,

2
@kalehmann va bene: 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

Risposte:


1231

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


32
Sarebbe difficile inizializzare un grande array multidimensionale in questo modo. Tuttavia, questa funzione può essere utilizzata per creare un multidimensionale vuoto, con le dimensioni specificate come parametri.
Anderson Green,

2
@AndersonGreen È una buona cosa che tu abbia menzionato un link per coloro che sono interessati alla soluzione di array multi-D, ma la domanda e la risposta di Ballsacian1 riguardano l'array "2D", non l'array "multi-D"
evilReiko

Dovresti esaminare tutto ... ad esempio alert (items [0] [1]); // 2 ecc.
Dois,

1
@SashikaXP, questo non funziona per i primi indici diversi da 0.
Michael Franzl,

1
La domanda è come dichiarare un array bidimensionale. Questo è quello che stavo cercando e ho trovato questo e seguendo le risposte che non riescono a discernere la differenza tra dichiarare e inizializzare. C'è anche una dichiarazione con lunghezza nota o illimitata, nessuna delle quali è discussa.
chris,

444

È sufficiente trasformare ciascun elemento all'interno dell'array in un array.

var x = new Array(10);

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

console.log(x);


6
Possono usare cose come le stringhe per le loro chiavi e valori? myArray ['Book'] ['item1']?
Diego,

42
@Diego, sì, ma non è questo ciò a cui sono destinate le matrici. È meglio usare un oggetto quando le tue chiavi sono stringhe.
Matthew Crumley,

10
Mi piace questo esempio meglio della risposta accettata perché può essere implementato per array di dimensioni dinamiche, ad esempio new Array(size)dove sizeè una variabile.
Variadicismo,

1
non funziona - errore nell'assegnazione. In che modo questa risposta ha ottenuto 280 Mi piace se è inutile?
Gargo,

1
Questo funziona, grazie. Puoi vedere l'esempio Gargo jsfiddle.net/matasoy/oetw73sj
matasoy

198

Simile alla risposta di Activa, ecco una funzione per creare un array n-dimensionale:

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

2
Questo può creare un array a 4 dimensioni?
trusktr,

4
@trusktr: Sì, è possibile creare tutte le dimensioni desiderate (entro i limiti della memoria). Basta passare nella lunghezza delle quattro dimensioni. Ad esempio var array = createArray(2, 3, 4, 5);,.
Matthew Crumley,

4
Migliore risposta ! Tuttavia, non consiglierei di usarlo con 0 o 1 parametri (inutili)
Apolo

2
@BritishDeveloper Sì. Questo è un array 5D con ogni lunghezza a 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 mi dispiace sprecare il tuo tempo - Ero sarcastico: /
BritishDeveloper

84

Javascript ha solo array monodimensionali, ma è possibile creare array di array, come altri hanno sottolineato.

La seguente funzione può essere utilizzata per costruire un array 2-d di dimensioni fisse:

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

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

  return arr;
}

Il numero di colonne non è molto importante, poiché non è necessario specificare la dimensione di un array prima di usarlo.

Quindi puoi semplicemente chiamare:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

voglio creare un array a 2 dimensioni che rappresenterebbe un mazzo di carte. Quale sarebbe un array 2-dim che contiene il valore della carta e quindi il seme. Quale sarebbe il modo più semplice per farlo.
Doug Hauf,

1
funzione Create2DArray (righe) {var arr = []; per (var i = 0; i <righe; i ++) {arr [i] = []; } return arr; } funzione 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; per (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} funzione loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); stampare (myCardDeck); }
Doug Hauf

2
@Doug: in realtà vuoi una matrice unidimensionale di oggetti con 2 attributi. var deck = []; mazzo [0] = {faccia: 1, seme: 'H'};
TeasingDart

@DougHauf che è un array 2D minimizzato ?? : P: D
Mahi,

78

La via più facile:

var myArray = [[]];

29
che è un array a 2 dimensioni
Maurizio, in Danimarca, il

15
Sì, stai attento. Assegnare myArray [0] [qualunque cosa] va bene, ma prova a impostare myArray [1] [qualunque cosa] e si lamenta che myArray [1] non è definito.
Filippo,

22
@Philip devi impostare myArray[1]=[];prima di assegnaremyArray[1][0]=5;
182764125216,

4
Attenzione, questo non "crea un array 1x1 vuoto" come ha scritto @AndersonGreen. Crea un array "1x0" (ovvero 1 riga contenente un array con 0 colonne). myArray.length == 1e myArray[0].length == 0. Che quindi dà il risultato sbagliato se si copia quindi un array "0x0" "veramente vuoto".
JonBrave,

3
@ 182764125216 quella era la conoscenza del giorno per me. Grazie :)
th3pirat3

76

Come creare un array bidimensionale vuoto (una riga)

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

2 e 4 sono rispettivamente prima e seconda dimensione.

Ci stiamo avvalendo di Array.from, che può richiedere un parametro simile a un array e una mappatura opzionale per ciascuno degli elementi.

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

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

Lo stesso trucco può essere utilizzato per creare un array JavaScript contenente 1 ... N


In alternativa (ma più inefficiente del 12% con n = 10,000)

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

La riduzione delle prestazioni deriva dal fatto che è necessario inizializzare i primi valori di dimensione per l'esecuzione .map. Ricorda che Arraynon assegnerai le posizioni fino a quando non le ordinerai tramite .filll'assegnazione diretta o diretta del valore.

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


Azione supplementare

Ecco un metodo che appare corretto, ma presenta problemi .

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

Mentre restituisce l'array bidimensionale ( [ [ <4 empty items> ], [ <4 empty items> ] ]) apparentemente desiderato , c'è un problema: gli array della prima dimensione sono stati copiati per riferimento. Ciò significa che a arr[0][0] = 'foo'cambierebbe effettivamente due righe anziché una.

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


Suggerisco questo:Array.from({length:5}, () => [])
vsync

Soggettivo qui, ma questa risposta (la prima e la seconda al suo interno) sembra il miglior equilibrio tra succinto, veloce e moderno.
Brady Dowling,

@zurfyx qualche idea, o qualcuno lo sa, perché Webstorm si lamenta di questo? Sembra array.from continua a lasciare i valori come indefiniti e quindi non riesco a lavorare con l'array creato, anche se lo snippet funziona bene qui su StackOverflow
correttamente

46

Il motivo per cui alcuni dicono che non è possibile è perché un array bidimensionale è in realtà solo un array di array. Gli altri commenti qui forniscono metodi perfettamente validi per la creazione di matrici bidimensionali in JavaScript, ma il punto di vista più puro sarebbe che si dispone di una matrice unidimensionale di oggetti, ciascuno di questi oggetti sarebbe una matrice unidimensionale composta da due elementi.

Quindi, questa è la causa dei punti di vista contrastanti.


42
No non lo è. In alcune lingue, puoi avere matrici multidimensionali come string[3,5] = "foo";. È un approccio migliore per alcuni scenari, perché l'asse Y non è in realtà un figlio dell'asse X.
Rafael Soares,

3
Una volta che arriva al codice macchina sottostante, tutti i tensori di dimensione> 1 sono matrici di matrici, qualunque sia la lingua di cui stiamo parlando. Vale la pena tenerlo presente per motivi di ottimizzazione della cache. Qualsiasi linguaggio decente che si rivolge seriamente al calcolo numerico ti permetterà di allineare la tua struttura multidimensionale in memoria in modo tale che la dimensione più utilizzata venga memorizzata in modo contiguo. Python's Numpy, Fortran e C, vengono in mente. In effetti ci sono casi in cui vale la pena ridurre la dimensionalità in più strutture per questo motivo.
Thomas Browne,

I computer non hanno nozione di dimensioni. C'è solo 1 dimensione, l'indirizzo di memoria. Tutto il resto è decorazione notazionale a beneficio del programmatore.
TeasingDart

3
@ThomasBrowne Non esattamente. Gli "array di array" richiedono un certo spazio di archiviazione per le dimensioni degli array interni (possono differire) e un altro puntatore che fa riferimento per trovare il luogo in cui è archiviato un array interno. In qualsiasi linguaggio "decente", le matrici multidimensionali differiscono dalle matrici frastagliate, poiché sono di per sé strutture dati diverse. (E la parte confusa è che gli array C sono multidimensionali, anche se sono indicizzati con la sintassi [a] [b].)
polkovnikov.ph

33

Poche persone mostrano l'uso di push:
per portare qualcosa di nuovo, ti mostrerò come inizializzare la matrice con un certo valore, ad esempio: 0 o una stringa vuota "".
Ricordando che se hai un array di 10 elementi, in javascript l'ultimo indice sarà 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;
}

esempi di utilizzo:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

Rimuovo l'ultimo for(che imposta il valore predefinito) dalla tua procedura e scrivo m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- e otteniamo una matrice molto strage (troppo nidificata) - lo ripari nell'ultimo passaggio for-defaultValue, ma penso che tu possa riscrivere la procedura per usare meno arras nidificati prima impostazione dei valori predefiniti.
Kamil Kiełczewski,

27

Due-liner:

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

Genererà un array a della lunghezza 10, pieno di array. (Push aggiunge un elemento a un array e restituisce la nuova lunghezza)


13
One-liner: for (var a=[]; a.push([])<10;);?
Bergi,

@Bergi sarà ancora definita una variabile nella riga successiva ..?
StinkyCat

1
@StinkyCat: Sì, è così che varfunziona. È sempre nell'ambito delle funzioni.
Bergi,

Lo so, quindi il tuo one-liner è inutile in questo caso: non puoi "accedere ai suoi membri" (controlla la domanda)
StinkyCat

1
domenukk e @Bergi, entrambi avete ragione. L'ho provato e posso accedere a dopo il per. Chiedo scusa! e grazie, che questa sia una lezione per me;)
StinkyCat

24

La risposta più sana sembra essere

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


Nota che non possiamo riempire direttamente con le righe poiché fill usa un costruttore di copia superficiale, quindi tutte le righe condividono la stessa memoria ... ecco un esempio che dimostra come ogni riga sarebbe condivisa (presa da altre risposte):

// 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);

Questo dovrebbe essere al top. Ho fatto qualcosa di simile usando Array.apply(null, Array(nrows))ma questo è molto più elegante.
dimiguel

A questo proposito il mio ultimo commento ... Internet Explorer e Opera non hanno supporto per fill. Questo non funzionerà sulla maggior parte dei browser.
dimiguel

@dimgl Fill può essere emulato in questo caso con una mappa costante:, Array(nrows).map(() => 0)oppure,Array(nrows).map(function(){ return 0; });
Conor O'Brien,

20

La via più facile:

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'

18

Questo è quello che ho raggiunto:

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

Questo mi ha scritto bineeshkumar


2
Notare come è possibile accedere solo all'indice 0 dell'array principale. Questo non è utile come qualcosa che ti consente di impostare, ad esempio, appVar [5] [9] = 10; ... otterresti 'Impossibile impostare la proprietà "9" di undefined' con questo.
RaisinBranCrunch

Ma appVar[1][4] = "bineesh";è sbagliato, come risolverlo?
Gank,

16

Le matrici bidimensionali sono create allo stesso modo delle matrici monodimensionali. E tu accedi a loro come array[0][1].

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

alert (arr[2][1]); //alerts "4"

14

Non sono sicuro che qualcuno abbia risposto a questo, ma ho scoperto che ha funzionato abbastanza bene per me -

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

per esempio:

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

Per un array bidimensionale, ad esempio.


Come posso farlo in modo dinamico? Voglio le matrici interne con dimensioni diverse.
alap il

3
Non hai bisogno di virgole extra var array = [[],[]]è adeguato.
Kaya Toast,

13

Per creare un array 2D in javaScript, possiamo prima creare un array e quindi aggiungere array come elementi. Questo metodo restituirà un array 2D con il numero specificato di righe e colonne.

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

per creare un array utilizzare questo metodo come di seguito.

var array = Create2DArray(10,20);

2
Ti preghiamo di aggiungere alcune informazioni esplicative alla tua risposta che mostri come funziona e perché risolve il problema. Questo aiuterà gli altri a trovare questa pagina in futuro
Our Man in Bananas,

Quando avresti bisogno di un array preinizializzato con un certo numero di colonne in Javascript? È possibile accedere anche all'n-esimo elemento di un array [].
domenukk,

Ho notato che la funzione inizia con la maiuscola C, che (in base a determinate convenzioni) suggerisce che sarebbe un costruttore di funzioni e la useresti con la nuova parola chiave. Forse molto minore e un po 'supponente, ma suggerirei comunque una parola non maiuscola.
Hachi,

12

Per creare una matrice "2D" non sparsa (x, y) con tutti gli indici indirizzabili e i valori impostati su null:

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

matrice "3D" di bonus (x, y, z)

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

Variazioni e correzioni al riguardo sono state menzionate nei commenti e in vari punti in risposta a questa domanda, ma non come una risposta effettiva, quindi la aggiungo qui.

Va notato che (simile alla maggior parte delle altre risposte) questo ha una complessità temporale di O (x * y), quindi probabilmente non è adatto per array molto grandi.


1
fai attenzione perché fillimposta lo stesso valore. se si cambia nullin `oggetto sarà lo stesso oggetto in ogni colonna
Stanislav Mayorov

@StanislavMayorov Se vuoi impostare il valore di ogni cella, usa lo stesso trucco:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam,

10

Usa comprensioni array

In JavaScript 1.7 e versioni successive è possibile utilizzare la comprensione degli array per creare array bidimensionali. È inoltre possibile filtrare e / o manipolare le voci durante il riempimento dell'array e non è necessario utilizzare i loop.

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"]
         ]
*/

È possibile creare qualsiasi n x marray desiderato e riempirlo con un valore predefinito chiamando

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],
         ]
*/

Altri esempi e documentazione sono disponibili qui .

Questa non è ancora una funzionalità standard .


Un rapido controllo su Google qui ... sì ... la fordichiarazione è ancora un ciclo ...
Pimp Trizkit

1
Non è supportato da nessun browser - QUI ?
Kamil Kiełczewski,

10

Per gli amanti del liner Array.from ()

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

Un altro (dal commento di dmitry_romanov) usa Array (). Fill ()

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

Utilizzo dell'operatore spread ES6 + ("ispirato" dalla risposta InspiredJW :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
possiamo rimuovere 0nella prima fill()funzione:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

Il mio approccio è molto simile alla risposta di @Bineesh ma con un approccio più generale.

È possibile dichiarare il doppio array come segue:

var myDoubleArray = [[]];

E la memorizzazione e l'accesso ai contenuti nel modo seguente:

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'],) 

Questo stamperà l'output previsto

[ 9, 8 ] 9 123

8

Prestazione

Oggi 2020.02.05 eseguo test su MacO HighSierra 10.13.6 su Chrome v79.0, Safari v13.0.4 e Firefox v72.0, per le soluzioni scelte.

Conclusioni per array 2d non inizializzati

  • soluzione esoterica {}/arr[[i,j]] (N) è la più veloce per array grandi e piccoli e sembra sia una buona scelta per array sparsi
  • soluzioni basate su for-[]/while (A, G) sono veloci e sono una buona scelta per array di piccole dimensioni.
  • soluzioni for-[] (B, C) sono veloci e sono una buona scelta per array di grandi dimensioni
  • soluzioni basate su Array..map/from/fill (I, J, K, L, M) sono piuttosto lente per array di piccole dimensioni e abbastanza veloci per array di grandi dimensioni
  • sorprendentemente for-Array(n)(B, C) è molto più lento nel safari rispetto a for-[](A)
  • sorprendentemente for-[](A) per array di grandi dimensioni è lento su tutti i browser
  • le soluzioni K sono lente per array di piccole dimensioni per tutti i browser
  • le soluzioni A, E, G sono lente per array di grandi dimensioni per tutti i browser
  • la soluzione M è la più lenta per tutti gli array su tutti i browser

inserisci qui la descrizione dell'immagine

Conclusioni per array 2d inizializzato

  • le soluzioni basate su for/while(A, B, C, D, E, G) sono più veloci / abbastanza veloci per array di piccole dimensioni su tutti i browser
  • le soluzioni basate su for(A, B, C, E) sono più veloci / abbastanza veloci per array di grandi dimensioni su tutti i browser
  • soluzioni basate su Array..map/from/fill (I, J, K, L, M) sono mediamente veloci o lente per piccoli array su tutti i browser
  • le soluzioni F, G, H, I, J, K, L per array di grandi dimensioni sono medie o veloci su Chrome e Safari ma più lente su Firefox.
  • la soluzione esoterica {}/arr[[i,j]](N) è la più lenta per array piccoli e grandi su tutti i browser

inserisci qui la descrizione dell'immagine

Dettagli

Test per soluzioni che non riempiono (inizializzano) array di output

Testiamo la velocità delle soluzioni per

  • matrici di piccole dimensioni (12 elementi): puoi eseguire i test sulla tua macchina QUI
  • array di grandi dimensioni (1 milione di elementi) array: puoi eseguire test QUI sulla tua macchina

Test per soluzioni che riempiono (inizializzano) array di output

Testiamo la velocità delle soluzioni per

  • matrici di piccole dimensioni (12 elementi): puoi eseguire i test sulla tua macchina QUI
  • array di grandi dimensioni (1 milione di elementi) array: puoi eseguire test QUI sulla tua macchina

inserisci qui la descrizione dell'immagine


7

Ho trovato di seguito il modo più semplice:

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

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;lanciaUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski il

@ KamilKiełczewski hai ragione, sembra che questo inizi solo per il primo array di array, per il secondo prima di farlo array1[1][100] = 666;, devi farlo array1[1] = [];.
GMsoF,

6

Javascript non supporta array bidimensionali, invece memorizziamo un array all'interno di un altro array e recuperiamo i dati da quell'array in base alla posizione dell'array a cui desideri accedere. Ricorda che la numerazione degli array inizia da ZERO .

Esempio di codice:

/* 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

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


6

ES6 +, ES2015 + possono farlo in modo ancora più semplice


Creazione di array 3 x 2 riempiti con true

[...Array(3)].map(item => Array(2).fill(true))

Devo confessare. Ho "adottato" la tua risposta e aggiunto alla mia , la collezione a una linea.
mio

5

Ho dovuto creare una funzione di array flessibile per aggiungere "record" ad esso di cui avevo bisogno e per poterli aggiornare e fare tutti i calcoli necessari prima di inviarlo a un database per ulteriori elaborazioni. Ecco il codice, spero che sia d'aiuto :).

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"
}

Sentiti libero di ottimizzare e / o segnalare eventuali bug :)


Che ne dici di solo aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit

5

Ecco un modo rapido che ho trovato per creare un array bidimensionale.

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

Puoi facilmente trasformare questa funzione anche in una funzione ES5.

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

Perché funziona: il new Array(n)costruttore crea un oggetto con un prototipo di Array.prototypee quindi assegna l'oggetto length, risultando in un array non popolato. A causa della sua mancanza di membri effettivi, non è possibile eseguire la Array.prototype.mapfunzione su di esso.

Tuttavia, quando si fornisce più di un argomento al costruttore, come quando lo si fa Array(1, 2, 3, 4), il costruttore utilizzerà l' argumentsoggetto per creare un'istanza e popolare un oggettoArray correttamente oggetto.

Per questo motivo, possiamo usare Array.apply(null, Array(x)), perché la applyfunzione diffonderà gli argomenti nel costruttore. Per chiarimenti, fare Array.apply(null, Array(3))equivale a fare Array(null, null, null).

Ora che abbiamo creato un array popolato reale, tutto ciò che dobbiamo fare è chiamare mape creare il secondo livello ( y).


5

Sotto uno, crea una matrice 5x5 e riempili null

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

console.log(md);


3
Questa risposta è sbagliata Creerà un array con lo stesso array riempiendo i suoi slot. md[1][0] = 3 e anche tutti gli altri elementi vengono aggiornati
Qiang

5

Le dimensioni di riga e colonna di un array noto solo in fase di esecuzione, quindi il seguente metodo potrebbe essere utilizzato per la creazione di un array 2D dinamico .

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

4

C'è un'altra soluzione, che non ti obbliga a pre-definire la dimensione dell'array 2d, e questo è molto conciso.

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

Questo funziona perché, [1,2]viene trasformato in una stringa, che viene utilizzata come chiave di stringa per l' tableoggetto.


Questa sola risposta non mi fa venir voglia di scherzare con la spazzatura che è array "multidimensionali" in JavaScript, anche se ho una soluzione molto elegante. Ciò dimostra anche che tutti gli altri non stanno realizzando array multidimensionali. un "array" in JavaScript; questa risposta "simulerà" completamente un array di dimensioni infinite, dimensioni pseudo-infinite di dimensioni e contenuti arbitrari. Tutte le altre risposte ricorsive e basate su loop hanno un limite superiore molto più basso alle dimensioni della struttura dell'array che possono creare. E la creazione la velocità sarà un grosso problema per queste strutture più grandi.
Pimp Trizkit

Usa questa linea invece per simulare il pre-riempimento:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit

Modo carino e creativo per "emulare" Array2D per oggetto :)
Kamil Kiełczewski

4

Per creare un array 4x6, è sufficiente farlo

const x = [...Array(6)].map(elem => new Array(4))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.