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.
Jak zadeklarować dwuwymiarową tablicę w JavaScript? (zakładając, że to możliwe)
Jak mam uzyskać dostęp do jego członków? (
myArray[0][1]
lubmyArray[0,1]
?)
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.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
nie wołanew 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 tematmap
funkcji, patrz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…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.
Odpowiedzi:
źródło
Po prostu każdy element w tablicy jest tablicą.
źródło
new Array(size)
Gdziesize
jest zmienną.Podobnie do odpowiedzi Activy, oto funkcja służąca do tworzenia tablicy n-wymiarowej:
źródło
var array = createArray(2, 3, 4, 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]]]]]
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:
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ć:
źródło
Najłatwiejszy sposób:
źródło
myArray[1]=[];
przed przypisaniemmyArray[1][0]=5;
myArray.length == 1
amyArray[0].length == 0
. Co daje zły wynik, jeśli skopiujesz do niej tablicę „prawdziwie pustą” „0x0”.Jak utworzyć pustą tablicę dwuwymiarową (jednowierszowa)
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.Tej samej sztuczki można użyć do utworzenia tablicy JavaScript zawierającej 1 ... N
Alternatywnie (ale bardziej nieefektywne 12% z
n = 10,000
)Spadek wydajności wiąże się z faktem, że do uruchomienia musimy zainicjować wartości pierwszego wymiaru
.map
. Pamiętaj, żeArray
nie przydzieli pozycji, dopóki nie zamówisz go poprzez.fill
bezpośrednie przypisanie wartości.Zagryźć
Oto metoda, która wydaje się poprawna, ale ma problemy .
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.źródło
Array.from({length:5}, () => [])
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.
źródło
string[3,5] = "foo";
. Jest to lepsze podejście do niektórych scenariuszy, ponieważ oś Y nie jest tak naprawdę dzieckiem osi X.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!
przykłady użycia:
źródło
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.Dwuwarstwowy:
Wygeneruje tablicę o długości 10, wypełnioną tablicami. (Push dodaje element do tablicy i zwraca nową długość)
źródło
for (var a=[]; a.push([])<10;);
?var
działa. Zawsze ma zasięg funkcjonalny.Najczystsza odpowiedź wydaje się być
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):
źródło
Array.apply(null, Array(nrows))
ale jest to o wiele bardziej eleganckie.fill
. To nie zadziała w większości przeglądarek.Array(nrows).map(() => 0)
lub,Array(nrows).map(function(){ return 0; });
Najłatwiejszy sposób:
źródło
Oto co osiągnąłem:
To przeliterowało mnie bineeshkumar
źródło
appVar[1][4] = "bineesh";
jest źle, jak to rozwiązać?Tablice dwuwymiarowe są tworzone w taki sam sposób, jak tablice jednowymiarowe. I masz do nich dostęp jak
array[0][1]
.źródło
Nie jestem pewien, czy ktoś na to odpowiedział, ale uznałem, że zadziałało to całkiem nieźle -
na przykład:
Na przykład dla tablicy dwuwymiarowej.
źródło
var array = [[],[]]
wystarczy.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.
aby utworzyć tablicę, użyj tej metody jak poniżej.
źródło
Aby utworzyć nieskomplikowaną tablicę „2D” (x, y) ze wszystkimi adresowalnymi indeksami i ustawionymi wartościami null:
dodatkowa tablica „3D” (x, y, z)
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.
źródło
fill
ustaw tę samą wartość. jeśli zmieni sięnull
na `object, będzie to ten sam obiekt w każdej kolumnielet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
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.
Możesz utworzyć dowolną
n x m
tablicę i wypełnić ją wartością domyślną, wywołującWięcej przykładów i dokumentacji można znaleźć tutaj .
Pamiętaj, że nie jest to jeszcze standardowa funkcja .
źródło
for
oświadczenie wciąż jest zapętlone ...Dla miłośników jednego liniowca Array.from ()
Kolejny (z komentarza dmitry_romanov) korzysta z Array (). Fill ()
Korzystanie z operatora rozprzestrzeniania ES6 + („zainspirowany” odpowiedzią InspiredJW :))
źródło
0
w pierwszejfill()
funkcji:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
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:
Przechowywanie i uzyskiwanie dostępu do zawartości w następujący sposób:
Spowoduje to wydrukowanie oczekiwanego wyniku
źródło
Znalazłem poniżej jest najprostszym sposobem:
źródło
array1[1][100] = 666;
rzutyUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
tobą musisz to zrobićarray1[1] = [];
.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
{}/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 tablicfor-[]/while
(A, G) są szybkie i są dobrym wyborem dla małych tablic.for-[]
(B, C) są szybkie i są dobrym wyborem dla dużych tablicArray..map/from/fill
(I, J, K, L, M) są dość wolne dla małych tablic i dość szybkie dla dużych tablicfor-Array(n)
(B, C) jest znacznie wolniejszy na safari niżfor-[]
(A)for-[]
(A) dla dużej tablicy jest powolny we wszystkich przeglądarkachWnioski dotyczące zainicjowanej tablicy 2d
for/while
(A, B, C, D, E, G) są najszybsze / dość szybkie dla małych tablic we wszystkich przeglądarkachfor
(A, B, C, E) są najszybsze / dość szybkie dla dużych tablic we wszystkich przeglądarkachArray..map/from/fill
(I, J, K, L, M) są średnio szybkie lub wolne dla małych tablic we wszystkich przeglądarkach{}/arr[[i,j]]
(N) jest najwolniejsze dla małych i dużych tablic we wszystkich przeglądarkachDetale
Testuj rozwiązania, które nie wypełniają (inicjują) tablicy wyjściowej
Testujemy szybkość rozwiązań
Pokaż fragment kodu
Testuj rozwiązania, które wypełniają (inicjalizują) tablicę wyjściową
Testujemy szybkość rozwiązań
Pokaż fragment kodu
źródło
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:
źródło
źródło
ES6 +, ES2015 + mogą to zrobić w jeszcze prostszy sposób
Tworzenie tablicy 3 x 2 wypełnionej true
źródło
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 :).
Zachęcamy do optymalizacji i / lub wskazania błędów :)
źródło
aLine.push([clmn1, clmn2, clmn3]);
?Oto szybki sposób na stworzenie dwuwymiarowej tablicy.
Możesz łatwo zmienić tę funkcję w funkcję ES5.
Dlaczego to działa:
new Array(n)
konstruktor tworzy obiekt z prototypem,Array.prototype
a następnie przypisuje obiektlength
, w wyniku czego powstaje pusta tablica. Ze względu na brak rzeczywistych członków nie możemy uruchomić na nimArray.prototype.map
funkcji.Jeśli jednak podasz konstruktorowi więcej niż jeden argument, na przykład gdy to zrobisz
Array(1, 2, 3, 4)
, konstruktor użyjearguments
obiektu doArray
prawidłowego utworzenia i wypełnienia obiektu.Z tego powodu możemy użyć
Array.apply(null, Array(x))
, ponieważapply
funkcja rozłoży argumenty na konstruktor. Dla wyjaśnienia działanieArray.apply(null, Array(3))
jest równoznaczne z działaniemArray(null, null, null)
.Teraz, gdy stworzyliśmy faktycznie zapełnioną tablicę, wszystko, co musimy zrobić, to wywołać
map
i utworzyć drugą warstwę (y
).źródło
Poniżej jeden tworzy matrycę 5x5 i wypełnia je
null
źródło
md[1][0] = 3
i wszystkie pozostałe elementy również zostały zaktualizowaneRozmiary wierszy i kolumn tablicy znane tylko w czasie wykonywania, a następnie można zastosować następującą metodę do utworzenia dynamicznej tablicy 2d .
źródło
Istnieje inne rozwiązanie, które nie zmusza do wstępnego zdefiniowania rozmiaru tablicy 2d i jest bardzo zwięzłe.
Działa to, ponieważ
[1,2]
przekształca się w ciąg znaków, który jest używany jako klucz ciągu dlatable
obiektu.źródło
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Aby utworzyć tablicę 4x6, po prostu zrób to
źródło