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.
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à.