Wenn ich ein Array mit Objekten als Werte an den Indizes habe wie:
%Vor%Ich habe einen Workaround gefunden, um die tatsächliche Länge zu erhalten:
%Vor%Aber warum gibt JS eine falsche Länge, wenn Objekte in zufälligen Indizes gespeichert werden? Es addiert nur 1 zum größten Index, der in einem Array gefunden wurde. Wie im obigen Beispiel war 90 der größte Index. Es addiert nur 1 und gibt 91 als Ausgabe. Demonstration
Das liegt daran, length
gibt Ihnen die nächste index
im Array verfügbar.
arrayLength
>Wenn das einzige Argument, das an den Array-Konstruktor übergeben wird, eine Ganzzahl zwischen 0 und 2 ^ 32-1 (einschließlich) ist, wird ein neues JavaScript-Array zurückgegeben, dessen Länge auf diese Zahl eingestellt ist.
Da Sie in den anderen Schlüsseln als 21, 90, 13 kein Element eingefügt haben, enthalten alle übrigen Indizes undefined
. DEMO
Um die tatsächliche Anzahl der Elemente im Array zu erhalten:
Kürzere Version
BEARBEITEN
Wenn das Array eine große Anzahl von Elementen enthält, ist das Schleifen, um seine Länge zu erhalten, nicht die beste Wahl.
Wie Sie in der Frage erwähnt haben, ist Object.keys(arr).length
in diesem Fall die beste Lösung, da Sie keine Eigenschaften für dieses Array hinzugefügt haben. Sonst ist length
nicht das, was du erwartest. (Danke an @RobG)
Das Array in JavaScript ist eine einfache zero-basierte Struktur. Der array.length
gibt den n + 1
zurück, wobei n
der maximale Index in einem Array ist.
Genau so funktioniert es - wenn Sie ein 90. Element zuweisen und die Länge dieses Arrays kleiner als 90 ist, wird ein Array auf 90 erweitert und der Wert des 90-ten Elements festgelegt. Alle fehlenden Werte werden als null
interpretiert.
Wenn Sie den folgenden Code versuchen:
%Vor%Sie erhalten folgendes JSON:
[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, 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, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, {}]
Außerdem ist array.length
kein schreibgeschützter Wert.
Wenn Sie length
value less als den aktuellen setzen, wird die Größe des Arrays geändert:
Wenn Sie length
value more als die aktuelle setzen, wird das Array ebenfalls erweitert:
Falls Sie solche Werte zuweisen müssen, können Sie JS-Objekte verwenden.
Sie können sie als assoziatives Array verwenden und beliebige Schlüssel / Wert-Paare zuweisen.
Weil dies das Verhalten von Array.length ist, wie in der ECMAScript-Spezifikation .
Die length-Eigenschaft dieses Array-Objekts ist eine Dateneigenschaft, deren Wert immer numerisch größer ist als der Name jeder löschbaren Eigenschaft, deren Name ein Array-Index ist.
So ist Array.length immer der Index des letzten Elements + 1.
Es liegt daran, dass Sie einen [90] als größten Index haben, so dass der Index von 0 bis 90 mit 91 beginnt.
Und wo Sie die Werte nicht wie a [80] usw. weitergegeben haben, speichert javascript sie als hole, d. h. für zB [1, , 3, , ,90]
, wobei Kommas verwendet werden, gibt das Loch im Array an.
Wenn Sie versuchen, auf diese Werte zuzugreifen, erhalten Sie undefined
.
Tags und Links javascript arrays