2015-08-07 10 views
6

Ho cercato in questo modo, ma mi restituisce il conteggio sbagliato:Come posso avere il conteggio reale di un array?

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

Va 1. Come posso avere il buon conteggio nel modo più veloce?

+1

In js numero 0 è come il numero 1 Ecco perché ottieni 667. –

+0

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

risposta

5

Poiché gli array sono indicizzati da 0. [0...666] è 667 elementi. Se si desidera effettivamente contare il numero di elementi disponibili, un array potrebbe non essere la soluzione migliore.

17

Dovrebbe essere 1.

No, dovrebbe essere 667, perché è così che length definito per le matrici standard in JavaScript, che aren't really arrays at all. Le matrici in JavaScript sono intrinsecamente sparse, nel senso che possono avere buchi (indici in cui non è memorizzato alcun valore di alcun tipo).

Come posso contare correttamente nel modo più veloce?

L'unico modo è il looping. Per esempio:

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

... o via reduce come in maček's answer. forEach, reduce, e altri simili visitano solo voci effettivamente esistenti, quindi ignorano i buchi negli array sparsi.


Devo dire che da quando IE8 ancora (sigh) ha un bel po 'di quota di mercato, è necessario shim forEach e reduce e tale su di essa, se si desidera utilizzarli. (Che è facile.)

di fare questo senza alcun spessoramento, e contare solo effettive proprietà di indice (non altri tipi di proprietà), quindi liberamente:

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

che utilizza una definizione leggermente allentato di ciò che un il nome della proprietà dell'indice è; se ne vuoi uno robusto, vedi la parte "Usa for-in correttamente" di this answer.

+1

siamo sulla stessa pagina, ma a 'ridurre' è probabilmente un po 'più pulito –

+0

@ maček: Heh, eccomi qui, essendo vecchio stile ... –

+0

No prob. +1 per fornire un'istruzione extra. –

4

È possibile utilizzare Object.keys().

Object.keys(myArr).length; 

Dalla documentazione:

Object.keys restituisce una matrice i cui elementi sono stringhe corrispondenti alle proprietà enumerabili trovato direttamente al momento oggetto. L'ordinamento delle proprietà è uguale a quello fornito dal loop delle proprietà dell'oggetto dell'oggetto.

Questa funzione è compatible with IE9+.La documentazione contiene anche un funtion che può essere aggiunto per la compatibilità con tutti i browser:

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

Attenzione che 'Object.keys' includerà anche i nomi di proprietà enumerabili non indicizzate, se presenti. –

+0

Attenzione: 'Object.keys' non è disponibile in IE 8/7/6. – gusper

+3

@gusper: può essere ingrandito se hai a che fare con browser obsoleti. –

8

È possibile contare il numero di immobili non non definite utilizzando un ridurre

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

Mi chiedo cosa [DaveGomez] (http://stackoverflow.com/users/1650483/dave-gomez) trovi illeggibile a riguardo. Questo è perfetto. – canon

+1

@canon sì, devi prendere tutto con un granello di sale qui. Alcune persone non sanno di cosa stanno parlando. Non pretendo di sapere tutto, ma cerco di evitare di fornire risposte prive di certezza. –

Problemi correlati