2013-08-10 41 views
31

Chcę utworzyć dwuwymiarową tablicę w JavaScript, gdzie zamierzam przechowywać współrzędne (x, y). Nie wiem jeszcze, ile par współrzędnych będę posiadał, ponieważ będą one generowane dynamicznie przez dane wejściowe użytkownika.Zadeklaruj pustą dwuwymiarową tablicę w JavaScript?

Przykład zdefiniowanym 2d tablicy:

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

Chyba można wykorzystać metody dostarczania dodanie nowego zapisu w końcu szeregu.

Jak zadeklarować pustą dwuwymiarową tablicę tak, że kiedy użyję mojego pierwszego pliku Arr.push(), zostanie on dodany do indeksu 0, a każdy kolejny rekord zapisany przez naciśnięcie spowoduje pobranie następnego indeksu?

To jest prawdopodobnie bardzo łatwe do zrobienia, jestem po prostu początkującym użytkownikiem JS i byłbym wdzięczny, gdyby ktoś mógł napisać krótki, działający fragment kodu, który mógłbym zbadać. Dzięki

+0

Czy próbowałeś 'var Arr = new Array (new Array());'? I tak, 'push' i' pop' dodaje lub usuwa elementy z końca tablicy, podczas gdy 'shift' i' unshift' usuwają lub dodają elementy na początku tablicy. – abiessu

+0

To brzmi jak dwa różne pytania. Najpierw potrzebujesz tablicy o dowolnym rozmiarze. Następnie pytasz o inne pytanie, które dotyczy metody push. (Jeśli chcesz odpowiedzieć na własne pytanie, myślę, że najlepiej jest to zrobić w sekcji odpowiedzi.) To jest najwyższe pytanie w Google dotyczące tworzenia wielowymiarowych tablic w JavaScript i wiem, że Google nie dyktować treść tutaj, ale powiedziałbym, że jest to zasadniczo ważne pytanie z szeroką gamą zwariowanych odpowiedzi. –

Odpowiedz

48

Wystarczy zadeklarować regularne tablicę tak:

var arry = []; 

Wtedy, gdy masz parę wartości, aby dodać do tablicy, wszystko co musisz zrobić, to:

arry.push([value_1, value2]); 

I tak, przy pierwszym wywołaniu arry.push, para wartości zostanie umieszczona na indeksie 0.

Z repliki nodejs:

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

Oczywiście, ponieważ javascript jest dynamicznie wpisywany, nie będzie kontrolera typu wymuszającego, że tablica pozostaje dwuwymiarowa. Musisz upewnić się, że tylko dodać par współrzędnych i nie należy wykonać następujące czynności:

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

wydaje się to być eleganckie rozwiązanie, więc mam współrzędne X i Y, i wstawiam je tak: arry.push ([x, y]); - ale jak mam wrócić później, na przykład współrzędna x w indeksie 0? – Zannix

+2

Możesz po prostu pobrać arry [0] [0]. (Aby uzyskać współrzędną Y, można pobrać arry [0] [1].) – dg123

3

Można spróbować czegoś takiego: -

var arr = new Array([]); 

dane push:

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

Pusta tablica jest określona przez wartości z pominięciem, tak:

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

Ty można zagnieździć jedną tablicę w innej przy użyciu skróconej składni:

var twoDee = [[]]; 
13

Jeśli chcesz mieć możliwość dostępu matryca jak tak macierzy [i] [j]

znajdę jest najbardziej odpowiedni do zainicjowania go w pętli.

var matrix = [], 
    cols = 3; 

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

to daje [[], [], []]

tak matrycę [0] [0] matryca [1] [0] powrotna zdefiniowana i nie błędu "Uncaught TypeError: Nie można ustawić właściwości" 0 "nieokreślonego"

0

Zazwyczaj znamy liczbę kolumn, ale może nie wierszy (rekordy). Oto przykład mojego rozwiązania wykorzystującego większość z powyższych. (Dla tych, tutaj bardziej doświadczony w JS niż mnie - dość dużo everone - wszelkie sugestie poprawy kod mile widziane)

 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]]; } 
     } 

A jeśli przechodząc tę ​​tablicę do sever Ajax, który pracuje dla mnie jest

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

Rozejrzałem się po różnych odpowiedziach i naprawdę jest ich wiele. Jest to najszybszy 2d array mogę utworzyć:

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. 

Albo ...

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

Zarówno praca dla mnie. Pierwszy z nich wydaje się, że to może być rekurencyjna :-D

+0

Krok a.fill (a) wydaje się nie robić nic. Jako [] ma długość 0, która umieszcza 0 kopie wewnątrz – eduardogbg

+0

Hi @eduardogbg moje przypuszczenie, że JavaScript poprawił się, odkąd opublikowałem odpowiedź. Tak jak napisałem, notacja przecinka jest nowa w ES6. Spędziłem sporo czasu na badaniu wszystkich dostępnych rozwiązań, ponieważ uczyłem JavaScript w tym czasie, a moja klasa wpadła na ten problem.Stworzyłem nawet Codepen https://codepen.io/pjbrunet/pen/JJWovm, aby przetestować to. Ale masz rację, wydaje się, że wypełnienie nie jest już konieczne - świetnie! Wracając na początku lat 90., używałem tablic 2D takich jak ta przez cały czas dla sprite'ów, czcionek itp. Więc byłem naprawdę zaskoczony JavaScript wymagał dodatkowych kroków, aby zainicjować drugi wymiar. –

2

Co z

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

należy odczytać „suma jest 7”

+0

Teraz ustaw 'arr2 [1,0] = 4'. 'console.log (" suma jest "+ (arr2 [0,0] + arr2 [0,1]))' następnie daje "suma to 6". Tak naprawdę nie utworzyłeś dwuwymiarowej tablicy, ale prostą tablicę zawierającą wpisy "10" i "20". kiedy próbujesz uzyskać dostęp do wpisów za pomocą indeksu rozdzielanego przecinkami, to, co naprawdę robisz, jest opisane tutaj: https: //stackoverflow.com/questions/7421013/why-does-5-6-8-71-2-8-in- javascript – Daniel

0

Możesz wypełnić tablicę z tablic przy użyciu funkcji:

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

Wynikiem jest:

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]