Warum iteriert meine for-each-Schleife nicht über mein assoziatives JavaScript-Array-Objekt?
// defining an array
var array = [];
// assigning values to corresponding keys
array["Main"] = "Main page";
array["Guide"] = "Guide page";
array["Articles"] = "Articles page";
array["Forum"] = "Forum board";
// expected: loop over every item,
// yet it logs only "last" assigned value - "Forum"
for (var i = 0; i < array.length; i++) {
console.log(array[i]);
}
BEARBEITEN: jQuery each()
könnte hilfreich sein: https://api.jquery.com/jQuery.each/
javascript
arrays
foreach
Szymon Toda
quelle
quelle
associative arrays
in JS: Es ist entweder ein einfaches Array oder ein Objekt. Nichts verhindert das Hinzufügen nicht numerischer EigenschaftenArray
, aber das macht es nichtassociative
- insbesonderelength
werden diese Eigenschaften von Eigenschaften nicht automatisch gezählt.Antworten:
Die
.length
Eigenschaft verfolgt nur Eigenschaften mit numerischen Indizes (Schlüsseln). Sie verwenden Zeichenfolgen für Schlüssel.Du kannst das:
Um sicher zu gehen, ist es in solchen Schleifen eine gute Idee, sicherzustellen, dass keine der Eigenschaften unerwartete Ergebnisse der Vererbung sind:
Bearbeiten - Es ist jetzt wahrscheinlich eine gute Idee zu beachten, dass die
Object.keys()
Funktion in modernen Browsern und in Node usw. verfügbar ist. Diese Funktion gibt die "eigenen" Schlüssel eines Objekts als Array zurück:Die an übergebene Rückruffunktion
.forEach()
wird mit jedem Schlüssel und dem Schlüsselindex in dem von zurückgegebenen Array aufgerufenObject.keys()
. Es wird auch das Array übergeben, durch das die Funktion iteriert, aber dieses Array ist für uns nicht wirklich nützlich. Wir brauchen das ursprüngliche Objekt . Darauf kann direkt über den Namen zugegriffen werden, aber (meiner Meinung nach) ist es etwas schöner, ihn explizit zu übergeben, indem ein zweites Argument an.forEach()
das ursprüngliche Objekt übergeben wird, das wiethis
im Rückruf gebunden wird . (Ich habe gerade gesehen, dass dies in einem Kommentar unten vermerkt wurde.)quelle
var arr_jq_TabContents = {};
? Ich meine {}[]
und{}
? Nur die verschiedenen Prototypen?Object.keys(arr_jq_TabContents).forEach( function(key) { ... } );
Dies ist ein sehr einfacher Ansatz. Der Vorteil ist, dass Sie auch Schlüssel erhalten können:
Für ES6:
Für ES6: (Wenn Sie Wert, Index und das Array selbst möchten)
quelle
var
in Schleifen verwenden, die ein nicht vorhandenes Scoping vorschlagen. Verwenden Sievar
vor der Schleife oderlet
in der Schleife.for
generiert eine Variablendeklaration in einer Schleife einen Bereich, der auf den Hauptteil derfor
Schleife beschränkt ist. In JavaScript ist eine von deklarierte Variablevar
jedoch immer eine globale Funktion, selbst wenn Sie sie in einefor
Schleife schreiben . Siehe hier: davidwalsh.name/for-and-against-letvar
in Javascript erstellt Variablen im Speicher, auch nachdem die Schleife abgeschlossen ist.Es gibt bereits einige einfache Beispiele, aber ich stelle anhand Ihrer Formulierung fest, dass Sie wahrscheinlich aus einem PHP-Hintergrund stammen und erwarten, dass JavaScript auf die gleiche Weise funktioniert - dies ist jedoch nicht der Fall. Ein PHP unterscheidet
array
sich sehr von einem JavaScriptArray
.In PHP kann ein assoziatives Array das meiste tun, was ein numerisch indiziertes Array kann (die
array_*
Funktionen funktionieren, Sie könnencount()
es usw.). Sie erstellen einfach ein Array und beginnen mit der Zuweisung zu Zeichenfolgenindizes anstelle von numerischen.In JavaScript ist alles ein Objekt (mit Ausnahme der Grundelemente: Zeichenfolge, numerisch, boolesch), und Arrays sind eine bestimmte Implementierung, mit der Sie numerische Indizes erstellen können. Alles , was zu einer Reihe geschoben wird seine Wirkung
length
, und kann gegenüber der Verwendung Array Methoden wiederholt werden (map
,forEach
,reduce
,filter
,find
, etc.) Da jedoch alles ein Objekt ist, du bist immer frei einfach assign Eigenschaften, denn das ist etwas , was Sie tun , um jedes Objekt. Die eckige Klammer ist einfach eine andere Möglichkeit, auf eine Eigenschaft zuzugreifen. In Ihrem Fall also:ist eigentlich gleichbedeutend mit:
Aus Ihrer Beschreibung geht hervor, dass Sie ein 'assoziatives Array' möchten, aber für JavaScript ist dies ein einfacher Fall, bei dem ein Objekt als Hashmap verwendet wird. Ich weiß auch, dass es ein Beispiel ist, aber vermeiden Sie nicht aussagekräftige Namen, die nur den Variablentyp (z. B.
array
) beschreiben, und Namen, die darauf basieren, was er enthalten sollte (zpages
. B. ). Einfache Objekte haben nicht viele gute direkte Wege zu iterieren, wir werden so oft drehen dann in Arrays zuerst unter Verwendung vonObject
Methoden (Object.keys
in diesem Fall - es gibt auchentries
undvalues
gerade jetzt zu einigen Browsern hinzugefügt werden) , die wir können Schleife.quelle
arr_jq_TabContents[key]
sieht das Array als 0-Index-Form.quelle
Hier ist eine einfache Möglichkeit, ein assoziatives Array als generischen Objekttyp zu verwenden:
quelle
Wenn die Datei node.js oder der Browser unterstützt wird
Object.entries()
, kann sie als Alternative zur Verwendung verwendet werdenObject.keys()
( https://stackoverflow.com/a/18804596/225291 ).In diesem Beispiel wird
forEach
die Destrukturierungszuweisung eines Arrays verwendet.quelle
Dies ist in den meisten Fällen (im Wesentlichen) falsch:
Dadurch wird eine Nicht-Element-Eigenschaft für das Array mit dem Namen erstellt
Main
. Obwohl Arrays Objekte sind, möchten Sie normalerweise keine Nicht-Elementeigenschaften für sie erstellen.Wenn Sie
array
anhand dieser Namen indizieren möchten , verwenden Sie normalerweise einMap
oder ein einfaches Objekt, kein Array.Mit einem
Map
(ES2015 +), den ich nennen werde,map
weil ich kreativ bin:Sie durchlaufen dann die Iteratoren mit von seinen
values
,keys
oderentries
Methoden, zum Beispiel:Verwenden eines einfachen Objekts, das ich kreativ nennen werde
obj
:Sie würde dann seinen Inhalt mit iterieren
Object.keys
,Object.values
oderObject.entries
, zum Beispiel:quelle
In diesem Code habe ich die Brackets-Methode für Aufrufwerte im Array verwendet, da sie ein Array enthielt, jedoch kurz die Idee, dass eine Variable i einen Eigenschaftsschlüssel und eine Schleife mit beiden Werten des zugeordneten Arrays hat
perfekte Methode, wenn Sie interessiert sind, drücken Sie gerne
quelle
Du kannst das
quelle