Kaip "JavaScript" efektyviai suskaičiuoti objekto raktų / savybių skaičių?

Kaip greičiausiai suskaičiuoti objekto raktus / savybes? Ar galima tai padaryti neiteruojant objekto, t. y. nedarant

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

("Firefox" turėjo stebuklingą savybę __count__, bet ji buvo pašalinta maždaug 4 versijoje.)

Jei iš tikrųjų susiduriate su našumo problema, siūlyčiau skambučius, kuriais į objektą ir iš objekto pridedamos ir (arba) iš jo pašalinamos savybės, papildyti funkcija, kuri taip pat didina ir (arba) mažina atitinkamai pavadintą (dydžio?) savybę.

Pradinį savybių skaičių reikia apskaičiuoti tik vieną kartą, o toliau - tik vieną kartą. Jei iš tikrųjų nėra našumo problemos, nesivarginkite. Tiesiog įtraukite šią kodo dalį į funkciją getNumberOfProperties(object) ir viskas.

Komentarai (6)

Nežinau jokio būdo, kaip tai padaryti, tačiau, kad iteracijų būtų kuo mažiau, galite pabandyti patikrinti, ar egzistuoja __count__, ir jei jo nėra (t. y. ne "Firefox"), tada galite iteruoti per objektą ir apibrėžti jį vėlesniam naudojimui, pvz:

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

Tokiu būdu bet kuri naršyklė, palaikanti `count``, jį naudotų, o iteracijos būtų atliekamos tik tose naršyklėse, kurios jo neturi. Jei skaičius keičiasi ir jūs negalite to padaryti, visada galite jį paversti funkcija:

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

Tokiu būdu bet kada, kai pateiksite nuorodą į myobj.`count``, funkcija bus paleista ir perskaičiuota.

Komentarai (4)

Nemanau, kad tai įmanoma (bent jau nenaudojant kai kurių vidinių įtaisų). Ir nemanau, kad daug laimėtumėte tai optimizavę.

Komentarai (1)