Ich habe online gelesen und einige Orte sagen, dass es nicht möglich ist, einige sagen, dass es möglich ist und geben dann ein Beispiel und andere widerlegen das Beispiel usw.
Wie deklariere ich ein zweidimensionales Array in JavaScript? (vorausgesetzt es ist möglich)
Wie würde ich auf seine Mitglieder zugreifen? (
myArray[0][1]
odermyArray[0,1]
?)
var arr2D = new Array(5).fill(new Array(3));
, zeigt jedes Element von Array (5) auf dasselbe Array (3). Verwenden Sie daher am besten eine for-Schleife, um Sub-Arrays dynamisch zu füllen.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
ruft nichtnew Array(3)
jeden Index des Arrays auf, der gefüllt wird, da es sich nicht um einen Lambda-Ausdruck oder etwas anderes handelt, wie zum Beispiel den obigen Kommentar von Longfei Wu, der das Array zunächst mit Nullen füllt und dann die Map-Funktion mit einem Lambda verwendet Füllen Sie jedes Element mit einem neuen Array. Die Füllfunktion füllt das Array einfach mit genau dem, was Sie ihm sagen. Ist das sinnvoll? Weitere Informationen zurmap
Funktion finden Sie unter: 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.
Antworten:
quelle
Sie machen einfach jedes Element innerhalb des Arrays zu einem Array.
quelle
new Array(size)
wosize
eine Variable ist.Ähnlich wie bei Activas Antwort gibt es hier eine Funktion zum Erstellen eines n-dimensionalen Arrays:
quelle
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 hat nur eindimensionale Arrays, aber Sie können Arrays von Arrays erstellen, wie andere betonten.
Die folgende Funktion kann verwendet werden, um ein 2D-Array mit festen Abmessungen zu erstellen:
Die Anzahl der Spalten ist nicht wirklich wichtig, da die Größe eines Arrays vor der Verwendung nicht angegeben werden muss.
Dann können Sie einfach anrufen:
quelle
Der einfachste Weg:
quelle
myArray[1]=[];
vor dem ZuweisenmyArray[1][0]=5;
myArray.length == 1
undmyArray[0].length == 0
. Was dann das falsche Ergebnis ergibt, wenn Sie dann ein "wirklich leeres" "0x0" -Array hinein kopieren.So erstellen Sie ein leeres zweidimensionales Array (einzeilig)
2 und 4 sind die erste bzw. zweite Dimension.
Wir verwenden
Array.from
, die einen Array-ähnlichen Parameter und eine optionale Zuordnung für jedes der Elemente verwenden können.Der gleiche Trick kann verwendet werden, um ein JavaScript-Array mit 1 ... N zu erstellen
Alternativ (aber ineffizienter 12% mit
n = 10,000
)Der Leistungsabfall ist darauf zurückzuführen, dass die ersten Dimensionswerte für die Ausführung initialisiert werden müssen
.map
. DenkenArray
Sie daran, dass die Positionen erst zugewiesen werden, wenn Sie sie durch.fill
oder direkt zuweisen .Nachverfolgen
Hier ist eine Methode, die korrekt erscheint, aber Probleme aufweist .
Während es das scheinbar gewünschte zweidimensionale Array (
[ [ <4 empty items> ], [ <4 empty items> ] ]
) zurückgibt , gibt es einen Haken: Arrays der ersten Dimension wurden als Referenz kopiert. Das bedeutet, dass aarr[0][0] = 'foo'
tatsächlich zwei Zeilen anstelle von einer ändern würde.quelle
Array.from({length:5}, () => [])
Einige sagen, dass dies nicht möglich ist, weil ein zweidimensionales Array eigentlich nur ein Array von Arrays ist. Die anderen Kommentare hier bieten vollkommen gültige Methoden zum Erstellen zweidimensionaler Arrays in JavaScript. Der reinste Gesichtspunkt wäre jedoch, dass Sie ein eindimensionales Array von Objekten haben. Jedes dieser Objekte wäre ein eindimensionales Array, das aus zwei Elementen besteht.
Das ist also die Ursache für die widersprüchlichen Sichtweisen.
quelle
string[3,5] = "foo";
. Für einige Szenarien ist dies ein besserer Ansatz, da die Y-Achse eigentlich kein Kind der X-Achse ist.Nur wenige Leute zeigen die Verwendung von Push:
Um etwas Neues zu bringen, zeige ich Ihnen, wie Sie die Matrix mit einem Wert initialisieren, zum Beispiel: 0 oder einer leeren Zeichenfolge "".
Wenn Sie ein Array mit 10 Elementen haben, ist der letzte Index in Javascript 9!
Anwendungsbeispiele:
quelle
for
(der den Standardwert festlegt) aus Ihrer Prozedur und schreibem=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));
- und wir erhalten eine sehr strenge Matrix (zu viel verschachtelt) - Sie reparieren ihn im letzten for-defaultValue-Schritt, aber ich denke, Sie können die Prozedur neu schreiben, um zuvor weniger verschachtelte Arras zu verwenden Festlegen von Standardwerten.Zweiliner:
Es wird ein Array a der Länge 10 generiert, das mit Arrays gefüllt ist. (Push fügt einem Array ein Element hinzu und gibt die neue Länge zurück.)
quelle
for (var a=[]; a.push([])<10;);
?var
funktioniert es. Es ist immer funktionsbezogen.Die vernünftigste Antwort scheint zu sein
Beachten Sie, dass wir nicht direkt mit den Zeilen füllen können, da die Füllung einen flachen Kopierkonstruktor verwendet. Daher würden alle Zeilen denselben Speicher verwenden. Hier ist ein Beispiel, das zeigt, wie jede Zeile gemeinsam genutzt wird (aus anderen Antworten entnommen):
quelle
Array.apply(null, Array(nrows))
aber das ist viel eleganter.fill
. Dies funktioniert in den meisten Browsern nicht.Array(nrows).map(() => 0)
oderArray(nrows).map(function(){ return 0; });
Der einfachste Weg:
quelle
Das habe ich erreicht:
Das buchstabierte mich bineeshkumar
quelle
appVar[1][4] = "bineesh";
ist falsch, wie man es löst?Zweidimensionale Arrays werden genauso erstellt wie eindimensionale Arrays. Und Sie greifen gerne darauf zu
array[0][1]
.quelle
Ich bin mir nicht sicher, ob jemand darauf geantwortet hat, aber ich fand, dass dies für mich ziemlich gut funktioniert hat -
z.B:
Zum Beispiel für ein zweidimensionales Array.
quelle
var array = [[],[]]
ist ausreichend.Um ein 2D-Array in JavaScript zu erstellen, können wir zuerst ein Array erstellen und dann Arrays als Elemente hinzufügen. Diese Methode gibt ein 2D-Array mit der angegebenen Anzahl von Zeilen und Spalten zurück.
Verwenden Sie diese Methode wie folgt, um ein Array zu erstellen.
quelle
So erstellen Sie ein nicht spärliches "2D" -Array (x, y) mit allen adressierbaren Indizes und auf null gesetzten Werten:
Bonus "3D" Array (x, y, z)
Variationen und Korrekturen hierzu wurden in Kommentaren und an verschiedenen Stellen als Antwort auf diese Frage erwähnt, jedoch nicht als tatsächliche Antwort, daher füge ich sie hier hinzu.
Es sollte beachtet werden, dass dies (ähnlich wie die meisten anderen Antworten) eine O (x * y) -Zeitkomplexität aufweist, so dass es wahrscheinlich nicht für sehr große Arrays geeignet ist.
quelle
fill
den gleichen Wert einstellen. Wenn Sienull
zu "Objekt" wechseln , wird es in jeder Spalte dasselbe Objekt seinlet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
Verwenden Sie Array-Verständnisse
In JavaScript 1.7 und höher können Sie Array-Verständnis verwenden , um zweidimensionale Arrays zu erstellen. Sie können die Einträge auch filtern und / oder bearbeiten, während Sie das Array füllen, und müssen keine Schleifen verwenden.
Sie können jedes
n x m
gewünschte Array erstellen und durch Aufrufen mit einem Standardwert füllenWeitere Beispiele und Dokumentationen finden Sie hier .
Bitte beachten Sie, dass dies noch keine Standardfunktion ist .
quelle
for
Aussage ist immer noch eine Schleife ...Für Einzeiler Liebhaber Array.from ()
Ein anderer (aus dem Kommentar von dmitry_romanov) verwendet Array (). Fill ()
Verwenden des ES6 + Spread- Operators ("inspiriert" von der InspiredJW- Antwort :))
quelle
0
in der erstenfill()
Funktion entfernen :const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Mein Ansatz ist der Antwort von @Bineesh sehr ähnlich, jedoch mit einem allgemeineren Ansatz.
Sie können das Double-Array wie folgt deklarieren:
Und das Speichern und Zugreifen auf die Inhalte auf folgende Weise:
Dadurch wird die erwartete Ausgabe gedruckt
quelle
Ich fand unten ist der einfachste Weg:
quelle
array1[1][100] = 666;
WürfeUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
, müssen Sie dies tunarray1[1] = [];
.Performance
Heute 2020.02.05 führe ich Tests auf MacOs HighSierra 10.13.6 unter Chrome v79.0, Safari v13.0.4 und Firefox v72.0 für ausgewählte Lösungen durch.
Schlussfolgerungen für nicht initialisiertes 2d-Array
{}/arr[[i,j]]
(N) ist für große und kleine Arrays am schnellsten und scheint für große, spärliche Arrays eine gute Wahl zu seinfor-[]/while
(A, G) basieren , sind schnell und eine gute Wahl für kleine Arrays.for-[]
(B, C) sind schnell und eine gute Wahl für große ArraysArray..map/from/fill
(I, J, K, L, M) basieren, sind für kleine Arrays ziemlich langsam und für große Arrays ziemlich schnellfor-Array(n)
(B, C) auf Safari viel langsamer alsfor-[]
(A)for-[]
(A) für große Arrays in allen Browsern langsamSchlussfolgerungen für das initialisierte 2d-Array
for/while
(A, B, C, D, E, G) basieren, sind für kleine Arrays in allen Browsern am schnellsten / ziemlich schnellfor
(A, B, C, E) basieren, sind für große Arrays in allen Browsern am schnellsten / ziemlich schnellArray..map/from/fill
(I, J, K, L, M) basieren, sind für kleine Arrays in allen Browsern mittelschnell oder langsam{}/arr[[i,j]]
(N) ist für kleine und große Arrays in allen Browsern am langsamstenEinzelheiten
Testen Sie auf Lösungen, die das Ausgabearray nicht füllen (initialisieren)
Wir testen die Geschwindigkeit von Lösungen für
Code-Snippet anzeigen
Testen Sie auf Lösungen, die das Ausgabearray füllen (initialisieren)
Wir testen die Geschwindigkeit von Lösungen für
Code-Snippet anzeigen
quelle
Javascript unterstützt keine zweidimensionalen Arrays. Stattdessen speichern wir ein Array in einem anderen Array und rufen die Daten von diesem Array ab, je nachdem, auf welche Position des Arrays Sie zugreifen möchten. Denken Sie daran , Array Numerierung beginnt bei Null .
Codebeispiel:
quelle
quelle
ES6 +, ES2015 + können dies noch einfacher tun
Erstellen eines 3 x 2-Arrays, das mit true gefüllt ist
quelle
Ich musste eine flexible Array-Funktion erstellen, um "Datensätze" nach Bedarf hinzuzufügen und sie aktualisieren und alle erforderlichen Berechnungen durchführen zu können, bevor ich sie zur weiteren Verarbeitung an eine Datenbank schickte. Hier ist der Code, hoffe es hilft :).
Fühlen Sie sich frei zu optimieren und / oder auf Fehler hinzuweisen :)
quelle
aLine.push([clmn1, clmn2, clmn3]);
?Hier ist eine schnelle Möglichkeit, ein zweidimensionales Array zu erstellen.
Sie können diese Funktion auch problemlos in eine ES5-Funktion umwandeln.
Warum dies funktioniert: Der
new Array(n)
Konstruktor erstellt ein Objekt mit einem Prototyp vonArray.prototype
und weist dann das Objekt zulength
, was zu einem nicht ausgefüllten Array führt. Aufgrund des Mangels an tatsächlichen Mitgliedern können wir dieArray.prototype.map
Funktion nicht darauf ausführen .Wenn Sie dem Konstruktor jedoch mehr als ein Argument bereitstellen, z. B. wenn Sie dies tun
Array(1, 2, 3, 4)
, verwendet der Konstruktor dasarguments
Objekt, um einArray
Objekt korrekt zu instanziieren und zu füllen .Aus diesem Grund können wir verwenden
Array.apply(null, Array(x))
, da dieapply
Funktion die Argumente im Konstruktor verteilt. Zur Verdeutlichung ist das TunArray.apply(null, Array(3))
gleichbedeutend mit dem TunArray(null, null, null)
.Nachdem wir ein tatsächlich bestücktes Array erstellt haben, müssen wir nur noch
map
die zweite Ebene (y
) aufrufen und erstellen .quelle
Erstellen Sie unter einer eine 5x5-Matrix und füllen Sie sie mit
null
quelle
md[1][0] = 3
und alle anderen Elemente werden ebenfalls aktualisiertZeilen- und Spaltengrößen eines Arrays, die nur zur Laufzeit bekannt sind, und die folgende Methode können zum Erstellen eines dynamischen 2D-Arrays verwendet werden .
quelle
Es gibt eine andere Lösung, die Sie nicht zwingt, die Größe des 2D-Arrays vorab zu definieren, und die sehr präzise ist.
Dies funktioniert, weil
[1,2]
es in eine Zeichenfolge umgewandelt wird, die als Zeichenfolgenschlüssel für dastable
Objekt verwendet wird.quelle
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Führen Sie dies einfach aus, um ein 4x6-Array zu erstellen
quelle