2013-08-10 16 views
31

Voglio creare un array bidimensionale in Javascript dove sto andando a memorizzare le coordinate (x, y). Non so ancora quante coppie di coordinate avrò perché saranno generate dinamicamente dall'input dell'utente.Dichiarare un array bidimensionale vuoto in Javascript?

Esempio di matrice 2d predefiniti:

var Arr=[[1,2],[3,4],[5,6]]; 

credo di poter utilizzare il metodo PUSH per aggiungere un nuovo record alla fine della matrice.

Come si dichiara un array bidimensionale vuoto in modo tale che quando utilizzo il mio primo Arr.push() verrà aggiunto all'indice 0 e ogni successivo record scritto da push prenderà l'indice successivo?

Questo è probabilmente molto facile da fare, sono solo un principiante con JS, e sarei grato se qualcuno potesse scrivere un breve frammento di codice funzionante che potrei esaminare. Grazie

+0

Hai provato 'var arr = new Array (new Array());'? E sì, 'push' e' pop' aggiungono o rimuovono elementi dalla fine dell'array, mentre 'shift' e' unshift' rimuovono o aggiungono elementi all'inizio dell'array. – abiessu

+0

Sembra due domande diverse. Prima vuoi la matrice di dimensioni arbitrarie. Quindi stai facendo una domanda diversa che riguarda il metodo push. (Inoltre, se vuoi rispondere alla tua stessa domanda, penso che sia meglio farlo nella sezione di risposta.) Questa è una domanda di alto livello in Google per la creazione di un array multidimensionale in JavaScript, e so che Google non lo fa dettare contenuti qui, ma direi che è una questione di fondamentale importanza con una vasta gamma di risposte stravaganti. –

risposta

48

Si può solo dichiarare una serie regolare in questo modo:

var arry = []; 

Poi, quando si dispone di una coppia di valori da aggiungere alla matrice, tutto quello che dovete fare è:

arry.push([value_1, value2]); 

E sì, la prima volta che si chiama arry.push, la coppia di valori sarà collocato nella posizione di indice 0.

Dalle nodejs repl:

> var arry = []; 
undefined 
> arry.push([1,2]); 
1 
> arry 
[ [ 1, 2 ] ] 
> arry.push([2,3]); 
2 
> arry 
[ [ 1, 2 ], [ 2, 3 ] ] 

Naturalmente, poiché JavaScript è dinamicamente tipizzati, non ci sarà alcun tipo correttore di esecuzione che la matrice rimane 2 dimensionale. Si dovrà fare in modo di aggiungere solo le coppie di coordinate e non effettuare le seguenti operazioni:

> arry.push(100); 
3 
> arry 
[ [ 1, 2 ], 
    [ 2, 3 ], 
    100 ] 
+1

questa sembra una soluzione elegante, quindi ho ottenuto le coordinate X e Y, e le inserisco così: arry.push ([x, y]); - ma come tornare più tardi, ad esempio la coordinata x sull'indice 0? – Zannix

+2

Puoi solo recuperare arry [0] [0]. (E per ottenere la coordinata Y, è possibile recuperare l'arry [0] [1]). – dg123

3

si può provare qualcosa di simile: -

var arr = new Array([]); 

dati push:

arr[0][0] = 'abc xyz'; 
5

Un array vuoto è definito da valori omettendo, in questo modo:

v=[[],[]] 
a=[] 
b=[1,2] 
a.push(b) 
b==a[0] 
5

È può annidare un array all'interno di un altro usando la sintassi abbreviata:

var twoDee = [[]]; 
13

Se si vuole essere in grado di accedere alla matrice in questo modo matrice [i] [j]

trovo è il più conveniente per iniziarlo in un ciclo.

var matrix = [], 
    cols = 3; 

//init the grid matrix 
for (var i = 0; i < cols; i++) { 
    matrix[i] = []; 
} 

questo vi darà [[], [], []]

così matrice [0] [0] matrice [1] [0] ritorno indefinita e non l'errore "Uncaught TypeError: Impossibile impostare la proprietà '0' di undefined"

0

Di solito conosciamo il numero di colonne ma forse non le righe (record). Ecco un esempio della mia soluzione facendo uso di gran parte di quanto sopra qui. (Per coloro che qui più esperto in JS di me - praticamente tutti erano allegri - eventuali proposte di miglioramento codice benvenuti)

 var a_cols = [null,null,null,null,null,null,null,null,null]; 
    var a_rxc = [[a_cols]]; 

    // just checking var arr = a_rxc.length ; //Array.isArray(a_rxc); 
    // alert ("a_rxc length=" + arr) ; Returned 1 
    /* Quick test of array to check can assign new rows to a_rxc. 
     i can be treated as the rows dimension and j the columns*/ 
     for (i=0; i<3; i++) { 
      for (j=0; j<9; j++) { 
      a_rxc[i][j] = i*j; 
      alert ("i=" + i + "j=" + j + " " + a_rxc[i][j]); 
      } 
      if (i+1<3) { a_rxc[i+1] = [[a_cols]]; } 
     } 

E se passare questo array per il sever l'Ajax che funziona per me è

$.post("../ajax/myservercode.php", 
     { 
     jqArrArg1 : a_onedimarray, 
     jqArrArg2 : a_rxc 
     }, 
     function(){ },"text") 
     .done(function(srvresp,status) { $("#id_PageContainer").html(srvresp);}) 
     .fail(function(jqXHR,status) { alert("jqXHR AJAX error " + jqXHR + ">>" + status);}); 
0

Ho dato un'occhiata a risposte diverse e c'è davvero una grande varietà. Questa è la matrice 2D più veloce ho potuto creare:

a = []; 
a.fill(a); // Fill 1st dimension with 2nd dimension. 

a[0,0] = "I'm";   
a[3,3] = "a"; 
a[33,33] = "nerd."; // I think the comma notation is new with ES6. 

Oppure ...

var a = b = []; 
a.fill(b); // Maybe less confusing. 

Entrambi lavorano per me. La prima sembra che potrebbe essere ricorsiva :-D

+0

Il passo a.fill (a) sembra non fare nulla. Poiché [] ha una lunghezza 0, che mette 0 copie di un interno a – eduardogbg

+0

Ciao @eduardogbg, suppongo che Javascript sia migliorato da quando ho postato la risposta. Come ho scritto, la notazione virgola è nuova in ES6. Ho passato un po 'di tempo a cercare tutte le soluzioni disponibili perché stavo insegnando Javascript al momento e la mia classe si è imbattuta in questo problema.Ho persino creato un Codepen https://codepen.io/pjbrunet/pen/JJWovm per testarlo. Ma hai ragione, sembra che il riempimento non sia più necessario - fantastico! Nei primi anni '90, usavo sempre array 2D come questo per folletti, font, ecc. Quindi fui davvero sorpreso dal fatto che Javascript richiedesse passaggi aggiuntivi per inizializzare la seconda dimensione. –

2

Cosa c'è di sbagliato con

var arr2 = new Array(10,20); 
    arr2[0,0] = 5; 
    arr2[0,1] = 2 
    console.log("sum is " + (arr2[0,0] + arr2[0,1])) 

dovrebbe leggere fuori "somma è 7"

+0

Ora imposta 'arr2 [1,0] = 4'. 'console.log (" sum is "+ (arr2 [0,0] + arr2 [0,1]))' quindi restituisce "sum is 6". Non hai davvero creato un array bidimensionale, ma un semplice array contenente le voci "10" e "20". quando provi ad accedere alle voci utilizzando indivisioni separate da virgole, ciò che fai realmente è descritto qui: https: //stackoverflow.com/questions/7421013/why-does-5-6-8-71-2-8-in- javascript – Daniel

0

Potete riempire un array con gli array usando una funzione:

var arr = []; 
var rows = 11; 
var columns = 12; 

fill2DimensionsArray(arr, rows, columns); 

function fill2DimensionsArray(arr, rows, columns){ 
    for (var i = 0; i < rows; i++) { 
     arr.push([0]) 
     for (var j = 0; j < columns; j++) { 
      arr[i][j] = 0; 
     } 
    } 
} 

Il risultato è:

Array(11) 
0:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
1:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
2:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
3:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
4:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
5:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
6:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
7:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
8:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
9:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
10:(12)[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]