Wat is de snelste manier om het aantal sleutels/eigenschappen van een object te tellen? Is het mogelijk om dit te doen zonder iteratie over het object? Dat wil zeggen zonder
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;
(Firefox had een magische __count__
eigenschap, maar deze is ergens rond versie 4 verwijderd).
Als je echt tegen een performantieprobleem aanloopt, zou ik voorstellen om de aanroepen die eigenschappen toevoegen/verwijderen aan/van het object te omhullen met een functie die ook een gepast benoemde (grootte?) eigenschap verhoogt/verlaagt.
Je hoeft dan maar één keer het initiële aantal eigenschappen te berekenen en van daaruit verder te gaan. Als er geen echt prestatieprobleem is, doe dan geen moeite. Verpak dat stukje code gewoon in een functie getNumberOfProperties(object)
en wees er klaar mee.
Ik'ben niet op de hoogte van een manier om dit te doen, maar om de iteraties tot een minimum te beperken, zou je kunnen proberen te controleren op het bestaan van __count__
en als het niet bestaat (d.w.z. niet Firefox) dan zou je kunnen itereren over het object en het definiëren voor later gebruik, bijv:
if (myobj.__count__ === undefined) {
myobj.__count__ = ...
}
Op deze manier zou elke browser die __count__
ondersteunt dat gebruiken, en iteraties zouden alleen worden uitgevoerd voor degenen die dat niet doen. Als de telling verandert en je kunt dit niet doen, dan kun je er altijd nog een functie van maken:
if (myobj.__count__ === undefined) {
myobj.__count__ = function() { return ... }
myobj.__count__.toString = function() { return this(); }
}
Op deze manier zal telkens wanneer je naar myobj.__count__
verwijst de functie afgaan en herberekenen.