L'implementazione standard degli oggetti ( proprietà e metodi interni agli oggetti ES5.1 ) non richiede Object
di tenere traccia del numero di chiavi / proprietà, quindi non dovrebbe esserci un modo standard per determinare la dimensione di un Object
senza iterare esplicitamente o implicitamente sulle sue chiavi.
Ecco quindi le alternative più comunemente utilizzate:
1. Object.keys () di ECMAScript
Object.keys(obj).length;
Funziona ripetendo internamente le chiavi per calcolare un array temporaneo e restituirne la lunghezza.
- Pro : sintassi leggibile e pulita. Nessuna libreria o codice personalizzato richiesto tranne uno spessore se il supporto nativo non è disponibile
- Contro : sovraccarico di memoria dovuto alla creazione dell'array.
2. Soluzioni basate su libreria
Molti esempi basati su librerie altrove in questo argomento sono utili modi di dire nel contesto della loro biblioteca. Da un punto di vista delle prestazioni, tuttavia, non c'è nulla da guadagnare rispetto a un perfetto codice no-library poiché tutti quei metodi di libreria effettivamente incapsulano un for-loop o ES5 Object.keys
(nativo o shimmed).
3. Ottimizzazione di un ciclo continuo
La parte più lenta di tale for-loop è generalmente la .hasOwnProperty()
chiamata, a causa dell'overhead della chiamata di funzione. Quindi, quando voglio solo il numero di voci di un oggetto JSON, salto semplicemente la .hasOwnProperty()
chiamata se so che nessun codice ha funzionato né si estenderà Object.prototype
.
Altrimenti, il tuo codice potrebbe essere leggermente ottimizzato creando k
local ( var k
) e usando l'operatore prefix-increment ( ++count
) invece di postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Un'altra idea si basa sulla memorizzazione nella cache del hasOwnProperty
metodo:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Se questo è più veloce o meno in un determinato ambiente è una questione di benchmarking. Ci si può aspettare comunque un rendimento molto limitato.