Ποιος είναι ο γρηγορότερος τρόπος για να μετρήσετε τον αριθμό των κλειδιών/ιδιοτήτων ενός αντικειμένου; Είναι δυνατόν να γίνει αυτό χωρίς επανάληψη πάνω στο αντικείμενο; δηλ. χωρίς να γίνει
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;
(Ο Firefox παρείχε μια μαγική ιδιότητα __count__
, αλλά αυτή αφαιρέθηκε κάπου γύρω στην έκδοση 4).
Αν αντιμετωπίζετε πραγματικά πρόβλημα απόδοσης, θα πρότεινα να περιτυλίξετε τις κλήσεις που προσθέτουν/αφαιρούν ιδιότητες στο/από το αντικείμενο με μια συνάρτηση που αυξάνει/μειώνει επίσης μια ιδιότητα με κατάλληλο όνομα (μέγεθος;).
Χρειάζεται να υπολογίσετε τον αρχικό αριθμό ιδιοτήτων μόνο μία φορά και να προχωρήσετε από εκεί και πέρα. Εάν δεν υπάρχει πραγματικό πρόβλημα απόδοσης, μην ασχοληθείτε. Απλά τυλίξτε αυτό το κομμάτι κώδικα σε μια συνάρτηση getNumberOfProperties(object)
και τελειώστε με αυτό.
Δεν γνωρίζω κανέναν τρόπο να το κάνετε αυτό, ωστόσο για να κρατήσετε τις επαναλήψεις στο ελάχιστο, θα μπορούσατε να δοκιμάσετε να ελέγξετε την ύπαρξη του __count__
και αν δεν υπάρχει (δηλαδή όχι ο Firefox) τότε θα μπορούσατε να επαναλάβετε το αντικείμενο και να το ορίσετε για μετέπειτα χρήση π.χ.:
if (myobj.__count__ === undefined) {
myobj.__count__ = ...
}
Με αυτόν τον τρόπο κάθε πρόγραμμα περιήγησης που υποστηρίζει το __count__
θα το χρησιμοποιούσε, και οι επαναλήψεις θα πραγματοποιούνταν μόνο για εκείνους που δεν το υποστηρίζουν. Αν η μέτρηση αλλάζει και δεν μπορείτε να το κάνετε αυτό, μπορείτε πάντα να το κάνετε μια συνάρτηση:
if (myobj.__count__ === undefined) {
myobj.__count__ = function() { return ... }
myobj.__count__.toString = function() { return this(); }
}
Με αυτόν τον τρόπο, κάθε φορά που αναφέρεστε στο myobj.__count__
η συνάρτηση θα πυροδοτείται και θα υπολογίζει εκ νέου.