Come contare in modo efficiente il numero di chiavi/proprietà di un oggetto in JavaScript?

Qual è il modo più veloce per contare il numero di chiavi/proprietà di un oggetto? È possibile farlo senza iterare sull'oggetto, cioè senza fare

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(Firefox forniva una proprietà magica __count__, ma questa è stata rimossa da qualche parte intorno alla versione 4).

Se stai effettivamente incontrando un problema di prestazioni, suggerirei di avvolgere le chiamate che aggiungono/rimuovono le proprietà da/all'oggetto con una funzione che incrementa/decrementa anche una proprietà dal nome appropriato (dimensione?).

Hai solo bisogno di calcolare il numero iniziale di proprietà una volta e andare avanti da lì. Se non c'è un vero problema di prestazioni, non preoccupatevi. Avvolgi semplicemente quel pezzo di codice in una funzione getNumberOfProperties(object) e falla finita.

Commentari (6)

Non sono a conoscenza di alcun modo per farlo, tuttavia per mantenere le iterazioni al minimo, si potrebbe provare a controllare l'esistenza di __count__ e se non esiste (cioè non Firefox) allora si potrebbe iterare l'oggetto e definirlo per un uso successivo, ad esempio:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

In questo modo ogni browser che supporta __count__ lo userebbe, e le iterazioni sarebbero effettuate solo per quelli che non lo fanno. Se il conteggio cambia e non puoi farlo, potresti sempre renderlo una funzione:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

In questo modo ogni volta che si fa riferimento a myobj.__count__ la funzione si attiverà e ricalcolerà.

Commentari (4)

Non credo che questo sia possibile (almeno non senza usare alcuni interni). E non credo che si guadagnerebbe molto ottimizzando questo.

Commentari (1)