Hva er den raskeste måten å telle antall nøkler/egenskaper til et objekt? Er det mulig å gjøre dette uten å iterere over objektet? dvs. uten å gjøre
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;
(Firefox ga en magisk __count__
-egenskap, men dette ble fjernet et sted rundt versjon 4).
Hvis du faktisk kjører inn i et ytelsesproblem, vil jeg foreslå å pakke inn anropene som legger til / fjerner egenskaper til / fra objektet med en funksjon som også øker / reduserer en passende navngitt (størrelse?) egenskap.
Du trenger bare å beregne det opprinnelige antallet egenskaper en gang og gå videre derfra. Hvis det ikke er et faktisk ytelsesproblem, ikke bry deg. Bare pakk den biten av koden i en funksjon getNumberOfProperties(object)
og bli ferdig med det.
Jeg er ikke klar over noen måte å gjøre dette på, men for å holde iterasjonene til et minimum, kan du prøve å se etter eksistensen av __count__
, og hvis den ikke eksisterer (dvs. ikke Firefox), kan du iterere over objektet og definere det for senere bruk, f.eks:
if (myobj.__count__ === undefined) {
myobj.__count__ = ...
}
På denne måten vil alle nettlesere som støtter __count__
bruke det, og iterasjoner vil bare bli utført for de som ikke gjør det. Hvis antallet endres og du ikke kan gjøre dette, kan du alltids gjøre det til en funksjon:
if (myobj.__count__ === undefined) {
myobj.__count__ = function() { return ... }
myobj.__count__.toString = function() { return this(); }
}
På denne måten hver gang du refererer til myobj.__count__
vil funksjonen avfyres og beregnes på nytt.