Czy istnieje sposób na pobranie (skądś) liczby elementów w obiekcie javascript? (tj. złożoność w czasie stałym).
Nie mogę znaleźć właściwości ani metody, która pobrałaby te informacje. Jak dotąd mogę myśleć tylko o wykonaniu iteracji przez całą kolekcję, ale to czas liniowy.
To dziwne, że nie ma bezpośredniego dostępu do rozmiaru obiektu, nie sądzisz.
EDYCJA:
mówię o Object
obiekcie (nie o obiektach w ogóle):
var obj = new Object ;
javascript
collections
elements
javascript-objects
Uwolnić się
źródło
źródło
Odpowiedzi:
Chociaż implementacje JS mogą wewnętrznie śledzić taką wartość, nie ma standardowego sposobu na jej uzyskanie.
W przeszłości, wariant Javascript Mozilli ujawniał niestandardowość
__count__
, ale został usunięty w wersji 1.8.5.W przypadku skryptów między przeglądarkami utkniesz z jawnym iterowaniem właściwości i sprawdzaniem
hasOwnProperty()
:W przypadku implementacji obsługujących ECMAScript 5, można to również zapisać jako (Kudos to Avi Flax )
Pamiętaj, że przegapisz również właściwości, których nie można wyliczyć (np. Tablice
length
).Jeśli używasz frameworka takiego jak jQuery, Prototype, Mootools, $ cokolwiek-najnowszego-hype, sprawdź, czy mają one własne API kolekcji, które może być lepszym rozwiązaniem twojego problemu niż używanie natywnych obiektów JS.
źródło
__count__
zniknął :(hasOwnProperty()
?Aby to zrobić w dowolnym środowisku zgodnym z ES5
(Obsługa przeglądarek stąd )
(Dokument na Object.keys tutaj , obejmuje metodę, którą można dodać do przeglądarek innych niż ECMA5)
źródło
jeśli już używasz jQuery w swojej kompilacji, zrób to:
Działa dobrze dla mnie na obiektach, a jQuery już miałem jako zależność.
źródło
źródło
AFAIK, nie ma sposobu, aby to zrobić niezawodnie, chyba że przełączysz się na tablicę. Co szczerze mówiąc, nie wydaje się dziwne - wydaje mi się całkiem proste, że tablice są policzalne, a obiekty nie.
Prawdopodobnie najbliżej otrzymasz coś takiego
Ale to stwarza problemy, a przynajmniej pytania. Zliczane są wszystkie właściwości utworzone przez użytkownika, w tym sama funkcja _length! I chociaż w tym prostym przykładzie możesz tego uniknąć, używając zwykłej funkcji, nie oznacza to, że możesz powstrzymać inne skrypty przed zrobieniem tego. więc co robisz? Ignorować właściwości funkcji?
W końcu myślę, że prawdopodobnie powinieneś porzucić pomysł policzalności swoich obiektów i wymyślić inny sposób robienia tego, co robisz.
źródło
Pojęcie liczby / długości / wymiarowości tak naprawdę nie ma sensu dla obiektu, a potrzeba jej sugeruje, że naprawdę chcesz mieć dla mnie Array.
Edycja: Wskazano mi, że chcesz za to O (1). O ile wiem, obawiam się, że taka droga nie istnieje.
źródło