Jak mogę utworzyć dwuwymiarową tablicę w JavaScript?

1136

Czytałem online i niektóre miejsca mówią, że nie jest to możliwe, niektóre twierdzą, że tak, a następnie podają przykład, a inne odrzucają przykład itp.

  1. Jak zadeklarować dwuwymiarową tablicę w JavaScript? (zakładając, że to możliwe)

  2. Jak mam uzyskać dostęp do jego członków? ( myArray[0][1]lub myArray[0,1]?)

Diego
źródło
21
Zakładając nieco pedantyczną definicję, technicznie niemożliwe jest utworzenie tablicy 2d w javascript. Ale możesz utworzyć tablicę tablic, co jest równoznaczne z tym samym.
IJ Kennedy
10
FYI ... kiedy wypełnisz tablicę przy użyciu większej liczby tablic var arr2D = new Array(5).fill(new Array(3));, każdy element Array (5) wskaże tę samą tablicę (3). Dlatego najlepiej użyć pętli for, aby dynamicznie zapełniać tablice podrzędne.
Josh Stribling
51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu
2
Innymi słowy, fillnie woła new Array(3)o wypełnienie każdego indeksu tablicy, ponieważ nie jest to wyrażenie lambda ani nic takiego, jak na przykład powyższy komentarz Longfei Wu, który początkowo wypełnia tablicę zerami, a następnie używa funkcji mapy za pomocą lambda, aby wypełnij każdy element nową tablicą. Funkcja wypełniania po prostu wypełnia tablicę dokładnie tym, co mówisz. Czy to ma sens? Aby uzyskać więcej informacji na temat mapfunkcji, patrz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling
2
@kalehmann, co jest w porządku: 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

Odpowiedzi:

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

Ballsacian1
źródło
32
W ten sposób zainicjowanie dużej tablicy wielowymiarowej byłoby trudne. Jednakże, ta funkcja może być wykorzystywane, aby utworzyć pustą wielowymiarowej, o wymiarach podanych jako parametry.
Anderson Green,
2
@AndersonGreen Dobrze, że wspomniałeś o linku dla osób zainteresowanych rozwiązaniem z macierzą multi-D, ale pytanie i odpowiedź Ballsacian1 dotyczą tablicy „2D”, a nie „multi-D”
evilReiko
Powinieneś przejść przez całą sprawę ... np. Alert (pozycje [0] [1]); // 2 itd.
Dois
1
@SashikaXP, to nie działa dla pierwszych indeksów innych niż 0.
Michael Franzl
1
Pytanie brzmi, jak zadeklarować tablicę dwuwymiarową. Właśnie tego szukałem i znalazłem to oraz następujące odpowiedzi, które nie dostrzegają różnicy między deklarowaniem a inicjalizacją. Istnieje również deklaracja o znanej długości lub bez ograniczeń, z których żadna nie jest omawiana.
Chris
444

Po prostu każdy element w tablicy jest tablicą.

var x = new Array(10);

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

console.log(x);

Sufian
źródło
6
Czy mogą używać takich rzeczy jak ciągi znaków do swoich kluczy i wartości? myArray ['Book'] ['item1']?
Diego
42
@Diego, tak, ale nie po to są tablice. Lepiej jest używać obiektu, gdy klucze są ciągami znaków.
Matthew Crumley,
10
Podoba mi się ten przykład lepiej niż zaakceptowana odpowiedź, ponieważ można go zaimplementować dla tablic o dynamicznym rozmiarze, np. new Array(size)Gdzie sizejest zmienną.
Wariadycyzm
1
nie działa - błąd przy przypisaniu. Jak ta odpowiedź ma 280 polubień, jeśli jest bezużyteczna?
Gargo
1
Działa, dzięki. Możesz zobaczyć przykład Gargo jsfiddle.net/matasoy/oetw73sj
matasoy
198

Podobnie do odpowiedzi Activy, oto funkcja służąca do tworzenia tablicy n-wymiarowej:

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
źródło
2
Czy to może stworzyć tablicę 4-wymiarową?
trusktr
4
@trusktr: Tak, możesz utworzyć tyle wymiarów, ile chcesz (w ramach ograniczeń pamięci). Wystarczy podać długość czterech wymiarów. Na przykład var array = createArray(2, 3, 4, 5);.
Matthew Crumley
4
Najlepsza odpowiedź ! Nie polecam jednak używać go z parametrami 0 lub 1 (bezużytecznymi)
Apolo
2
@BritishDeveloper Tak. Jest to tablica 5D o każdej długości przy 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 przepraszam za marnowanie czasu - byłem sarkastyczny: /
BritishDeveloper
84

JavaScript ma tylko tablice jednowymiarowe, ale możesz budować tablice tablic, jak zauważyli inni.

Poniższej funkcji można użyć do skonstruowania tablicy 2-wymiarowej o stałych wymiarach:

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

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

  return arr;
}

Liczba kolumn nie jest tak naprawdę ważna, ponieważ nie jest wymagane określenie rozmiaru tablicy przed użyciem.

Następnie możesz po prostu zadzwonić:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...
Philippe Leybaert
źródło
chcę stworzyć 2-ściemnianą tablicę, która reprezentowałaby talię kart. Który byłby 2-dim tablicą, która przechowuje wartość karty, a następnie w kolorze. Jaki byłby najłatwiejszy sposób to zrobić.
Doug Hauf
1
funkcja Create2DArray (wiersze) {var arr = []; dla (var i = 0; i <wiersze; i ++) {arr [i] = []; } return arr; } funkcja print (talia) {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; dla (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} funkcja loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); drukuj (myCardDeck); }
Doug Hauf
2
@Doug: Tak naprawdę potrzebujesz jednowymiarowej tablicy obiektów z 2 atrybutami. var deck = []; talia [0] = {twarz: 1, kolor: „H”};
TeasingDart
@DougHauf to zminimalizowana tablica 2D? : P: D
Mahi
78

Najłatwiejszy sposób:

var myArray = [[]];
Fred
źródło
29
która jest tablicą dwuwymiarową
Maurizio In Dania
15
Tak, ostrożnie z tym. Przypisanie myArray [0] [cokolwiek] jest w porządku, ale spróbuj ustawić myArray [1] [cokolwiek] i narzeka, że ​​myArray [1] jest niezdefiniowany.
Filip
22
@Filip musisz ustawić myArray[1]=[];przed przypisaniemmyArray[1][0]=5;
182764125216,
4
Pamiętaj, że to nie „tworzy pustą tablicę 1x1”, jak napisał @AndersonGreen. Tworzy tablicę „1x0” (tj. 1 wiersz zawierający tablicę z 0 kolumnami). myArray.length == 1a myArray[0].length == 0. Co daje zły wynik, jeśli skopiujesz do niej tablicę „prawdziwie pustą” „0x0”.
JonBrave,
3
@ 182764125216 to była dla mnie znajomość dnia . Dzięki :)
th3pirat3
76

Jak utworzyć pustą tablicę dwuwymiarową (jednowierszowa)

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

2 i 4 oznaczają odpowiednio pierwszy i drugi wymiar.

Wykorzystujemy Array.from, który może przyjąć tablicowy parametr i opcjonalne mapowanie dla każdego elementu.

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

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

Tej samej sztuczki można użyć do utworzenia tablicy JavaScript zawierającej 1 ... N


Alternatywnie (ale bardziej nieefektywne 12% z n = 10,000)

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

Spadek wydajności wiąże się z faktem, że do uruchomienia musimy zainicjować wartości pierwszego wymiaru .map. Pamiętaj, że Arraynie przydzieli pozycji, dopóki nie zamówisz go poprzez .fillbezpośrednie przypisanie wartości.

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


Zagryźć

Oto metoda, która wydaje się poprawna, ale ma problemy .

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

Chociaż zwraca pozornie pożądaną tablicę dwuwymiarową ( [ [ <4 empty items> ], [ <4 empty items> ] ]), istnieje tablica catch: pierwszy wymiar został skopiowany przez odniesienie. Oznacza to, arr[0][0] = 'foo'że faktycznie zmieniłby dwa rzędy zamiast jednego.

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

zurfyx
źródło
Sugeruję to:Array.from({length:5}, () => [])
vsync,
Subiektywne tutaj, ale ta odpowiedź (pierwsza i druga w niej) wydaje się najlepszą równowagą zwięzłej, szybkiej i nowoczesnej.
Brady Dowling
@zurfyx jakiś pomysł, czy ktoś wie, dlaczego webstorm na to narzeka? Wygląda na to, że array.from wciąż pozostawia wartości jako niezdefiniowane, a następnie nie mogę pracować z utworzoną tablicą, mimo że fragment
kodu
46

Niektórzy twierdzą, że nie jest to możliwe, ponieważ tablica dwuwymiarowa jest tak naprawdę tablicą tablic. Pozostałe komentarze tutaj zapewniają doskonale poprawne metody tworzenia dwuwymiarowych tablic w JavaScript, ale najczystszym punktem widzenia byłoby posiadanie jednowymiarowej tablicy obiektów, każdy z tych obiektów byłby jednowymiarową tablicą składającą się z dwóch elementów.

To jest przyczyną sprzecznych punktów widzenia.

James Conigliaro
źródło
41
Nie, nie jest. W niektórych językach możesz mieć tablice wielowymiarowe, takie jak string[3,5] = "foo";. Jest to lepsze podejście do niektórych scenariuszy, ponieważ oś Y nie jest tak naprawdę dzieckiem osi X.
Rafael Soares,
3
Gdy dojdzie do podstawowego kodu maszynowego, wszystkie tensory wymiaru> 1 są tablicami tablic, niezależnie od tego, o jakim języku mówimy. Warto o tym pamiętać ze względu na optymalizację pamięci podręcznej. Każdy przyzwoity język, który poważnie traktuje obliczenia numeryczne, pozwoli ci wyrównać wielowymiarową strukturę w pamięci, tak aby najczęściej używany wymiar był przechowywany w sposób ciągły. Na myśl przychodzą Numpy, Fortran i C Pythona. Rzeczywiście istnieją przypadki, w których z tego powodu warto zredukować wymiarowość do wielu struktur.
Thomas Browne
Komputery nie mają pojęcia o wymiarach. Jest tylko jeden wymiar, adres pamięci. Cała reszta to notacyjna dekoracja na rzecz programisty.
TeasingDart,
3
@ThomasBrowne Niezupełnie. „Tablice tablic” wymagają pewnej pamięci dla rozmiarów tablic wewnętrznych (mogą się różnić) i kolejnej dereferencji wskaźnika w celu znalezienia miejsca, w którym przechowywana jest tablica wewnętrzna. W każdym „przyzwoitym” języku tablice wielowymiarowe różnią się od tablic poszarpanych, ponieważ same w sobie są różnymi strukturami danych. (I mylące jest to, że tablice C są wielowymiarowe, mimo że są indeksowane za pomocą składni [a] [b].)
polkovnikov.ph
33

Niewiele osób pokazuje użycie push:
Aby wprowadzić coś nowego, pokażę ci, jak zainicjować macierz z pewną wartością, na przykład: 0 lub pusty ciąg „”.
Przypominając, że jeśli masz tablicę 10 elementów, w javascript ostatni indeks będzie wynosił 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;
}

przykłady użycia:

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
źródło
Usuwam ostatnią for(która ustawia wartość domyślną) z twojej procedury i piszę m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- i otrzymujemy bardzo macierz strage (za dużo zagnieżdżonych) - naprawiasz ją w ostatnim kroku for-defaultValue, ale myślę, że możesz przepisać procedurę, aby użyć mniej zagnieżdżonych tablic przed ustawienie wartości domyślnych.
Kamil Kiełczewski
27

Dwuwarstwowy:

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

Wygeneruje tablicę o długości 10, wypełnioną tablicami. (Push dodaje element do tablicy i zwraca nową długość)

domenukk
źródło
13
One-liner: for (var a=[]; a.push([])<10;);?
Bergi,
@ Bergi zmienna będzie nadal zdefiniowana w następnym wierszu ..?
StinkyCat 11.04.16
1
@StinkyCat: Tak, tak to vardziała. Zawsze ma zasięg funkcjonalny.
Bergi,
Wiem, dlatego twój liniowiec jest w tym przypadku bezużyteczny: nie możesz „uzyskać dostępu do jego członków” (sprawdź pytanie)
StinkyCat
1
domenukk i @Bergi, oboje macie rację. Wypróbowałem to i mogę uzyskać dostęp do po. Przepraszam! i dziękuję, niech to będzie dla mnie lekcja;)
StinkyCat 13.04.16
24

Najczystsza odpowiedź wydaje się być

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


Zauważ, że nie możemy bezpośrednio wypełnić wierszy, ponieważ fill używa konstruktora płytkiej kopii, dlatego wszystkie wiersze będą miały tę samą pamięć ... oto przykład, który pokazuje, w jaki sposób każdy wiersz byłby współdzielony (wzięty z innych odpowiedzi):

// 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
źródło
To powinno być na samym szczycie. Zrobiłem coś podobnego przy użyciu, Array.apply(null, Array(nrows))ale jest to o wiele bardziej eleganckie.
dimiguel
W związku z tym mój ostatni komentarz ... Internet Explorer i Opera nie mają wsparcia fill. To nie zadziała w większości przeglądarek.
dimiguel
@dimgl Wypełnienie można w tym przypadku emulować za pomocą stałej mapy:, Array(nrows).map(() => 0)lub,Array(nrows).map(function(){ return 0; });
Conor O'Brien
20

Najłatwiejszy sposób:

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
źródło
18

Oto co osiągnąłem:

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

To przeliterowało mnie bineeshkumar

Bineesh
źródło
2
Zauważ, że możesz uzyskać dostęp tylko do indeksu 0 macierzy nadrzędnej. Nie jest to tak przydatne, jak coś, co pozwala ustawić na przykład appVar [5] [9] = 10; ... dostaniesz „Nie można ustawić właściwości„ 9 ”niezdefiniowanej”.
RaisinBranCrunch
Ale appVar[1][4] = "bineesh";jest źle, jak to rozwiązać?
Gank
16

Tablice dwuwymiarowe są tworzone w taki sam sposób, jak tablice jednowymiarowe. I masz do nich dostęp jak array[0][1].

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

alert (arr[2][1]); //alerts "4"
TJ L.
źródło
14

Nie jestem pewien, czy ktoś na to odpowiedział, ale uznałem, że zadziałało to całkiem nieźle -

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

na przykład:

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

Na przykład dla tablicy dwuwymiarowej.

Uchenna
źródło
Jak mogę to zrobić dynamicznie? Chcę wewnętrznych tablic o różnych rozmiarach.
Alap
3
Nie potrzebujesz dodatkowych przecinków, var array = [[],[]]wystarczy.
Kaya Toast
13

Aby utworzyć tablicę 2D w javaScript, możemy najpierw utworzyć tablicę, a następnie dodać tablice jako elementy. Ta metoda zwróci tablicę 2D z podaną liczbą wierszy i kolumn.

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

aby utworzyć tablicę, użyj tej metody jak poniżej.

var array = Create2DArray(10,20);
główny
źródło
2
Dodaj do odpowiedzi kilka informacji wyjaśniających, jak to działa i dlaczego rozwiązuje problem. Pomoże to innym, którzy znajdą tę stronę w przyszłości
Our Man in Bananas
Kiedy potrzebujesz tablicy, która jest wstępnie zainicjalizowana z określoną liczbą kolumn w JavaScript? Możesz również uzyskać dostęp do n-tego elementu tablicy [].
domenukk
Zauważyłem, że funkcja zaczyna się od dużej litery C, co (zgodnie z pewnymi konwencjami) sugeruje, że byłby to konstruktor funkcji i używałbyś jej z nowym słowem kluczowym. Może bardzo niewielkie i nieco uparte, ale wciąż sugerowałbym słowo bez wielkich liter.
Hachi
12

Aby utworzyć nieskomplikowaną tablicę „2D” (x, y) ze wszystkimi adresowalnymi indeksami i ustawionymi wartościami null:

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

dodatkowa tablica „3D” (x, y, z)

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

Odmiany i poprawki na ten temat zostały wspomniane w komentarzach i w różnych punktach w odpowiedzi na to pytanie, ale nie jako rzeczywista odpowiedź, dlatego dodam ją tutaj.

Należy zauważyć, że (podobnie jak większość innych odpowiedzi) ma złożoność czasową O (x * y), więc prawdopodobnie nie nadaje się do bardzo dużych tablic.

Justin Ohms
źródło
1
bądź ostrożny, ponieważ fillustaw tę samą wartość. jeśli zmieni się nullna `object, będzie to ten sam obiekt w każdej kolumnie
Stanislav Mayorov
@StanislavMayorov Jeśli chcesz ustawić wartość każdej komórki, po prostu użyj tej samej sztuczki:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam
10

Używaj wyrażeń tablicowych

W JavaScript 1.7 i nowszych wersjach tablic można używać do interpretacji tablic. Możesz także filtrować i / lub manipulować wpisami podczas wypełniania tablicy i nie musisz używać pętli.

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

Możesz utworzyć dowolną n x mtablicę i wypełnić ją wartością domyślną, wywołując

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

Więcej przykładów i dokumentacji można znaleźć tutaj .

Pamiętaj, że nie jest to jeszcze standardowa funkcja .

Tim Hallyburton
źródło
Szybka kontrola google tutaj ... tak ... foroświadczenie wciąż jest zapętlone ...
Pimp Trizkit 10'18
1
Nie jest obsługiwany przez żadną przeglądarkę - TUTAJ ?
Kamil Kiełczewski
10

Dla miłośników jednego liniowca Array.from ()

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

Kolejny (z komentarza dmitry_romanov) korzysta z Array (). Fill ()

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

Korzystanie z operatora rozprzestrzeniania ES6 + („zainspirowany” odpowiedzią InspiredJW :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))
mój-
źródło
2
możemy usunąć 0w pierwszej fill()funkcji:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li
8

Moje podejście jest bardzo podobne do odpowiedzi @Bineesh, ale z bardziej ogólnym podejściem.

Możesz zadeklarować podwójną tablicę w następujący sposób:

var myDoubleArray = [[]];

Przechowywanie i uzyskiwanie dostępu do zawartości w następujący sposób:

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

Spowoduje to wydrukowanie oczekiwanego wyniku

[ 9, 8 ] 9 123
Alexander
źródło
7

Znalazłem poniżej jest najprostszym sposobem:

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

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);
GMsoF
źródło
array1[1][100] = 666;rzutyUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski
@ KamilKiełczewski masz rację, wygląda na to, że to inicjuje tylko dla pierwszej tablicy tablic, dla drugiej przed array1[1][100] = 666;tobą musisz to zrobić array1[1] = [];.
GMsoF
7

Wydajność

Dzisiaj 2020.02.05 wykonuję testy na MacOs HighSierra 10.13.6 na Chrome v79.0, Safari v13.0.4 i Firefox v72.0 dla wybranych rozwiązań.

Wnioski dla niezainicjowanej tablicy 2d

  • ezoteryczne rozwiązanie {}/arr[[i,j]](N) jest najszybsze dla dużych i małych tablic i wygląda na to, że jest dobrym wyborem dla dużych rzadkich tablic
  • rozwiązania oparte na for-[]/while(A, G) są szybkie i są dobrym wyborem dla małych tablic.
  • rozwiązania for-[](B, C) są szybkie i są dobrym wyborem dla dużych tablic
  • rozwiązania oparte na Array..map/from/fill(I, J, K, L, M) są dość wolne dla małych tablic i dość szybkie dla dużych tablic
  • zaskakująco for-Array(n)(B, C) jest znacznie wolniejszy na safari niż for-[](A)
  • zaskakująco for-[](A) dla dużej tablicy jest powolny we wszystkich przeglądarkach
  • rozwiązania K działa powoli dla małych tablic dla wszystkich przeglądarek
  • rozwiązania A, E, G są wolne dla dużych tablic dla wszystkich przeglądarek
  • rozwiązanie M jest najwolniejsze dla wszystkich tablic we wszystkich przeglądarkach

wprowadź opis zdjęcia tutaj

Wnioski dotyczące zainicjowanej tablicy 2d

  • rozwiązania oparte na for/while(A, B, C, D, E, G) są najszybsze / dość szybkie dla małych tablic we wszystkich przeglądarkach
  • rozwiązania oparte na for(A, B, C, E) są najszybsze / dość szybkie dla dużych tablic we wszystkich przeglądarkach
  • rozwiązania oparte na Array..map/from/fill(I, J, K, L, M) są średnio szybkie lub wolne dla małych tablic we wszystkich przeglądarkach
  • rozwiązania F, G, H, I, J, K, L dla dużych tablic są średnie lub szybkie na Chrome i Safari, ale najwolniejsze na Firefox.
  • ezoteryczne rozwiązanie {}/arr[[i,j]](N) jest najwolniejsze dla małych i dużych tablic we wszystkich przeglądarkach

wprowadź opis zdjęcia tutaj

Detale

Testuj rozwiązania, które nie wypełniają (inicjują) tablicy wyjściowej

Testujemy szybkość rozwiązań

  • małe tablice (12 elementów) - testy możesz wykonać na swoim komputerze TUTAJ
  • duże tablice (1 milion elementów) tablice - testy możesz wykonać na swoim komputerze TUTAJ

Testuj rozwiązania, które wypełniają (inicjalizują) tablicę wyjściową

Testujemy szybkość rozwiązań

  • małe tablice (12 elementów) - testy możesz wykonać na swoim komputerze TUTAJ
  • duże tablice (1 milion elementów) tablice - testy możesz wykonać na swoim komputerze TUTAJ

wprowadź opis zdjęcia tutaj

Kamil Kiełczewski
źródło
6

JavaScript nie obsługuje tablic dwuwymiarowych, zamiast tego przechowujemy tablicę wewnątrz innej tablicy i pobieramy dane z tej tablicy w zależności od pozycji tej tablicy, do której chcesz uzyskać dostęp. Pamiętaj, że numeracja tablic zaczyna się od ZERO .

Przykład kodu:

/* 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
Stóg
źródło
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);

antylopa
źródło
6

ES6 +, ES2015 + mogą to zrobić w jeszcze prostszy sposób


Tworzenie tablicy 3 x 2 wypełnionej true

[...Array(3)].map(item => Array(2).fill(true))
jwchang
źródło
Muszę się przyznać. „Przyjąłem” twoją odpowiedź i dodałem do mojej , kolekcji z jedną linią.
my-
5

Musiałem stworzyć elastyczną funkcję tablicową, aby w razie potrzeby dodawać do niej „rekordy” i móc je aktualizować i wykonywać wszelkie obliczenia, jakie były mi potrzebne, zanim wysłałem je do bazy danych w celu dalszego przetwarzania. Oto kod, mam nadzieję, że to pomoże :).

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

Zachęcamy do optymalizacji i / lub wskazania błędów :)

CJ Mendes
źródło
A może po prostu aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit
5

Oto szybki sposób na stworzenie dwuwymiarowej tablicy.

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

Możesz łatwo zmienić tę funkcję w funkcję ES5.

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

Dlaczego to działa: new Array(n)konstruktor tworzy obiekt z prototypem, Array.prototypea następnie przypisuje obiekt length, w wyniku czego powstaje pusta tablica. Ze względu na brak rzeczywistych członków nie możemy uruchomić na nim Array.prototype.mapfunkcji.

Jeśli jednak podasz konstruktorowi więcej niż jeden argument, na przykład gdy to zrobisz Array(1, 2, 3, 4), konstruktor użyje argumentsobiektu do Arrayprawidłowego utworzenia i wypełnienia obiektu.

Z tego powodu możemy użyć Array.apply(null, Array(x)), ponieważ applyfunkcja rozłoży argumenty na konstruktor. Dla wyjaśnienia działanie Array.apply(null, Array(3))jest równoznaczne z działaniem Array(null, null, null).

Teraz, gdy stworzyliśmy faktycznie zapełnioną tablicę, wszystko, co musimy zrobić, to wywołać mapi utworzyć drugą warstwę ( y).

dimiguel
źródło
5

Poniżej jeden tworzy matrycę 5x5 i wypełnia je null

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

console.log(md);

zeah
źródło
3
Ta odpowiedź jest zła. Stworzy tablicę z tą samą tablicą wypełniającą jej szczeliny. md[1][0] = 3 i wszystkie pozostałe elementy również zostały zaktualizowane
Qiang
5

Rozmiary wierszy i kolumn tablicy znane tylko w czasie wykonywania, a następnie można zastosować następującą metodę do utworzenia dynamicznej tablicy 2d .

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
źródło
4

Istnieje inne rozwiązanie, które nie zmusza do wstępnego zdefiniowania rozmiaru tablicy 2d i jest bardzo zwięzłe.

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

Działa to, ponieważ [1,2]przekształca się w ciąg znaków, który jest używany jako klucz ciągu dla tableobiektu.

Oli
źródło
Już sama ta odpowiedź sprawia, że ​​nie chcę zadzierać ze śmieciami, które są „wielowymiarowymi” tablicami w JavaScript, nawet jeśli mam bardzo eleganckie rozwiązanie. To także pokazuje, że wszyscy inni tak naprawdę nie tworzą tablic wielowymiarowych. „tablica” w JavaScript; ta odpowiedź całkowicie „zasymuluje” tablicę o nieskończonym rozmiarze o pseudo nieskończonym rozmiarze o dowolnych rozmiarach i zawartości. Wszystkie inne odpowiedzi oparte na rekurencji i pętli mają znacznie niższy górny limit wielkości struktury tablicy, którą mogą stworzyć. Szybkość będzie głównym problemem dla tych większych konstrukcji.
Pimp Trizkit
Zamiast tego użyj tej linii, aby zasymulować wstępne wypełnienie:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit
Fajny, kreatywny sposób na „naśladowanie” Array2D według obiektu :)
Kamil Kiełczewski
4

Aby utworzyć tablicę 4x6, po prostu zrób to

const x = [...Array(6)].map(elem => new Array(4))
Gość
źródło