2015-08-07 7 views
6

habe ich versucht auf diese Weise, aber es gibt mir die falsche Zählung:Wie kann ich die tatsächliche Anzahl eines Arrays haben?

myArr = []; 
myArr[666] = 'hello there'; 
console.log(myArr.length); // returns me 667 

Es sollte 1 sein Wie kann ich die gute Zählung auf dem schnellsten Weg haben?

+1

In js Nummer 0 reduzieren Verwendung ist wie die Nummer 1 Deshalb erhalten Sie 667. –

+0

http://stackoverflow.com/questions/7421013/why-does-5-6-8-71-2-8-in-javascript –

Antwort

5

Da Arrays mit 0 indexiert werden. [0...666] ist 667 Elemente. Wenn Sie tatsächlich zählen möchten, wie viele Elemente Sie haben, ist ein Array möglicherweise nicht die beste Lösung.

17

Es sollte 1 sein

Nein, es 667 sein sollte, denn das ist, wie length für Standard-Arrays in JavaScript definiert ist, welche aren't really arrays at all. Arrays in JavaScript sind inhärent spärlich, was bedeutet, dass sie Löcher in ihnen haben können (Indizes, in denen kein Wert gespeichert ist).

Wie kann ich die gute Zählung auf dem schnellsten Weg haben?

Der einzige Weg ist durch Schleifen. Zum Beispiel:

var count = 0; 
myArr.forEach(function() { 
    ++count; 
}); 
console.log(count); 

... oder über reduce wie in maček's answer. forEach, reduce und andere solche nur besuchen Einträge, die tatsächlich vorhanden sind, so dass sie die Löcher in Sparse-Arrays überspringen.


Ich sollte erwähnen, dass seit dem IE8 noch (seufz) ein gutes Stück Marktanteil hat, Sie forEach und reduce und so auf sie Shim benötigen, wenn Sie sie verwenden möchten. (Das ist einfach.)

Um dies zu tun, ohne Shim, und nur tatsächliche Indexeigenschaften (nicht andere Arten von Eigenschaften) zählen, dann los:

var count = 0, name; 
for (name in myArr) { 
    if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) { 
     ++count; 
    } 
} 

, die eine etwas lose Definition dessen, was ein verwendet Name der Indexeigenschaft ist; Wenn Sie eine robuste Version wünschen, lesen Sie den Abschnitt "For-in-for-correct" von this answer.

+1

wir sind auf der gleichen Seite, aber a 'reduzieren' ist wahrscheinlich ein wenig sauberer –

+0

@ maček: Heh, da bin ich, altmodisch ... –

+0

No prob. +1 für zusätzliche Bildung. –

4

Sie können Object.keys() verwenden.

Object.keys(myArr).length; 

Aus der Dokumentation:

Object.keys gibt ein Array, dessen Elemente strings den enumerable Eigenschaften direkt auf entsprechende Objekt gefunden. Die Reihenfolge der Eigenschaften ist die gleiche wie die durch die Schleife über die Eigenschaften des Objekts manuell.

Diese Funktion ist compatible with IE9+.Die Dokumentation enthält auch eine funtion, die auf Kompatibilität in allen Browsern hinzugefügt werden können:

if (!Object.keys) Object.keys = function(o) { 
    if (o !== Object(o)) 
    throw new TypeError('Object.keys called on a non-object'); 
    var k=[],p; 
    for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p); 
    return k; 
} 
+1

Hüten Sie sich davor, dass 'Object.keys' auch die Namen von Nicht-Index-Aufzählungseigenschaften enthält, falls vorhanden. –

+0

Warnung: 'Object.keys' ist im IE 8/7/6 nicht verfügbar. – gusper

+3

@Gusper: Es kann geglättet werden, wenn Sie mit veralteten Browsern zu tun haben. –

8

Sie die Anzahl der Nicht-undefinierten Eigenschaften zählen ein

var length = myArr.reduce(function(len) { return len+1; }, 0); 
console.log(length); // 1 
+0

Ich frage mich, was [DaveGomez] (http://stackoverflow.com/users/1650483/dave-gomez) unleserlich darüber findet. Dies ist perfekt. – canon

+1

@canon yeah du musst alles mit einem Körnchen Salz hier nehmen. Manche Leute wissen nicht, wovon sie reden. Ich behaupte nicht, alles zu wissen, aber ich versuche, Antworten zu vermeiden, die nicht sicher sind. –