Array.length gibt falsche Länge

9

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

    
Rex Overflow 26.06.2015, 04:42
quelle

4 Antworten

9

Das liegt daran, length gibt Ihnen die nächste index im Array verfügbar.

DOCS

>

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.

ECMA-Spezifikationen

>

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:

%Vor%

Kürzere Version

%Vor%

DEMO

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)

    
Tushar 26.06.2015, 04:42
quelle
3

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:

%Vor%

Wenn Sie length value more als die aktuelle setzen, wird das Array ebenfalls erweitert:

%Vor%

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.

%Vor%     
Yeldar Kurmangaliyev 26.06.2015 04:51
quelle
3

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.

    
Cory Danielson 26.06.2015 04:48
quelle
0

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 .

    
Bhojendra Nepal 26.06.2015 04:44
quelle

Tags und Links