Mam obiekt JavaScript, czy istnieje wbudowany lub zaakceptowany najlepszy sposób uzyskania długości tego obiektu?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Gareth Simpson
źródło
źródło
Object.keys(obj).length
Odpowiedzi:
Najbardziej niezawodną odpowiedzią (tj. Która uchwyci zamiar tego, co próbujesz zrobić, powodując jak najmniej błędów), byłoby:
JavaScript zawiera pewną konwencję, według której nie dodajesz elementów do Object.prototype , ponieważ może on przerywać wyliczenia w różnych bibliotekach. Jednak dodawanie metod do Object jest zwykle bezpieczne.
Oto aktualizacja z 2016 r. I powszechne wdrożenie ES5 i późniejszych wersji. W przypadku IE9 + i wszystkich innych współczesnych przeglądarek obsługujących ES5 + możesz użyć
Object.keys()
powyższego kodu:Nie musi to modyfikować żadnego istniejącego prototypu, ponieważ
Object.keys()
jest teraz wbudowany.Edycja : Obiekty mogą mieć właściwości symboliczne, których nie można zwrócić za pomocą metody Object.key. Zatem odpowiedź byłaby niepełna bez wspominania o nich.
Typ języka został dodany do języka, aby utworzyć unikalne identyfikatory właściwości obiektu. Główną zaletą typu Symbol jest zapobieganie nadpisywaniu.
Object.keys
lubObject.getOwnPropertyNames
nie działa dla właściwości symbolicznych. Aby je zwrócić, musisz użyćObject.getOwnPropertySymbols
.źródło
Object.keys(obj).length
Jeśli wiesz, że nie musisz się martwić
hasOwnProperty
czekami, możesz to zrobić bardzo prosto:źródło
Zaktualizowano : Jeśli używasz Underscore.js (zalecane, jest lekki!), Możesz to zrobić
Jeśli nie , i nie chcesz mieszać się z właściwościami obiektu z jakiegokolwiek powodu, a już używasz jQuery, wtyczka jest równie dostępna:
źródło
_.size()
było idealnym rozwiązaniem dla mojego projektu Meteor , który ma obsługę underscore.js.Oto najbardziej rozwiązanie dla różnych przeglądarek.
Jest to lepsze niż zaakceptowana odpowiedź, ponieważ używa natywnych kluczy Object.keys, jeśli istnieje. Dlatego jest najszybszy dla wszystkich współczesnych przeglądarek.
źródło
Object.keys()
zwraca tablicę zawierającą nazwy tylko tych właściwości, które są policzalne. Jeśli chcesz tablicy z WSZYSTKIMI właściwościami, powinieneś użyćObject.getOwnPropertyNames()
zamiast niej. Zobacz developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Nie jestem ekspertem w dziedzinie JavaScript, ale wygląda na to, że będziesz musiał przeglądać elementy i liczyć je, ponieważ Object nie ma metody długości:
@palmsey: W uczciwości w stosunku do OP dokumentacja JavaScript w rzeczywistości wyraźnie odnosi się do używania zmiennych typu Object w ten sposób jako „tablice asocjacyjne”.
źródło
Ta metoda pobiera wszystkie nazwy właściwości obiektu do tablicy, dzięki czemu można uzyskać długość tej tablicy, która jest równa długości kluczy obiektu.
źródło
Aby nie zadzierać z prototypem lub innym kodem, możesz zbudować i rozszerzyć własny obiekt:
Jeśli zawsze korzystasz z metody add, właściwość length będzie poprawna. Jeśli obawiasz się, że Ty lub inni zapomnieliście o jego użyciu, możecie dodać licznik właściwości, który inni też opublikowali w metodzie długości.
Oczywiście zawsze możesz zastąpić metody. Ale nawet jeśli to zrobisz, Twój kod prawdopodobnie zawiedzie zauważalnie, co ułatwi debugowanie. ;)
źródło
Oto jak i nie zapomnij sprawdzić, czy właściwość nie znajduje się w łańcuchu prototypów:
źródło
Po prostu użyj tego, aby uzyskać
length
:źródło
myArray
Oto zupełnie inne rozwiązanie, które będzie działać tylko w bardziej nowoczesnych przeglądarkach (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)
Zobacz jsFiddle
Skonfiguruj klasę tablicy asocjacyjnej
Teraz możesz użyć tego kodu w następujący sposób ...
źródło
length
właściwości, każdy kod, który używałby jej, musiałby mieć pewność, że nie spróbuje zapisać wartościlength
, ale myślę, że byłby taki sam, gdyby był również standardowa tablica. PrzesłonięciehasOwnProperty
dowolnego obiektu najprawdopodobniej spowodowałoby niepożądany wynik.To działa dla mnie:
źródło
W niektórych przypadkach lepiej jest po prostu przechowywać rozmiar w osobnej zmiennej. Zwłaszcza jeśli dodajesz do tablicy jeden element w jednym miejscu i możesz łatwo zwiększyć rozmiar. Oczywiście działałoby to znacznie szybciej, jeśli trzeba często sprawdzać rozmiar.
źródło
Posługiwać się:
źródło
I uczciwie dla @palmsey miał rację, nie są to tablice asocjacyjne, to zdecydowanie obiekty :) - wykonujące zadanie tablicy asocjacyjnej. Ale jeśli chodzi o szerszą kwestię, zdecydowanie masz do tego prawo zgodnie z tym dość pięknym artykułem, który znalazłem:
JavaScript „Tablice asocjacyjne” uważane za szkodliwe
Ale zgodnie z tym wszystkim, czy sama przyjęta odpowiedź nie jest złą praktyką?
Jeśli cokolwiek innego zostało dodane do Object .prototype, sugerowany kod zawiedzie:
Nie sądzę, że ta odpowiedź powinna być zaakceptowana, ponieważ nie można ufać jej działaniu, jeśli masz inny kod działający w tym samym kontekście wykonania. Aby to zrobić solidnie, na pewno musisz zdefiniować metodę rozmiaru w myArray i sprawdzać typ elementów podczas iteracji przez nie.
źródło
Jeśli potrzebujesz asocjacyjnej struktury danych, która ujawnia swój rozmiar, lepiej użyj mapy zamiast obiektu.
źródło
Co powiesz na coś takiego -
źródło
Jeśli mamy skrót
długość możemy uzyskać za pomocą długości kluczy, która jest długością skrótu:
źródło
źródło
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
Jeśli używasz AngularJS 1.x, możesz robić to po AngularJS, tworząc filtr i używając kodu z dowolnego z innych przykładów, takich jak:
Stosowanie
W twoim kontrolerze:
Lub twoim zdaniem:
źródło
Najprostszy sposób jest taki
gdzie mój obiekt jest obiektem o pożądanej długości
źródło
Jeśli nie chcesz obsługiwać przeglądarki Internet Explorer 8 lub starszej, możesz łatwo uzyskać liczbę właściwości obiektu, wykonując następujące dwa kroki:
Object.keys()
aby uzyskać tablicę zawierającą nazwy tylko tych właściwości, które są policzalne, lubObject.getOwnPropertyNames()
jeśli chcesz także dołączyć nazwy właściwości, które nie są policzalne..length
właściwość tej tablicy.Jeśli musisz to zrobić więcej niż raz, możesz zawrzeć tę logikę w funkcji:
Jak korzystać z tej konkretnej funkcji:
Zobacz także Fiddle, aby zobaczyć demo.
źródło
Użyj,
Object.keys(myObject).length
aby uzyskać długość obiektu / tablicyźródło
źródło
Odmianą niektórych z powyższych jest:
Jest to nieco bardziej elegancki sposób integracji hasOwnProp.
źródło
Oto inna wersja odpowiedzi Jamesa Cogana. Zamiast przekazywać argument, po prostu prototypuj klasę Object i popraw kod.
Przykład jsfiddle: http://jsfiddle.net/qar4j/1/
źródło
Object.prototype
- kiepski pomysł.Możesz po prostu użyć
Object.keys(obj).length
dowolnego obiektu, aby uzyskać jego długość. Object.keys zwraca tablicę zawierającą wszystkie klucze obiektów (właściwości), które mogą się przydać do znalezienia długości tego obiektu na podstawie długości odpowiedniej tablicy. Możesz nawet napisać dla tego funkcję . Stańmy się kreatywni i napiszmy również metodę (wraz z bardziej wygodną właściwością gettera):źródło
Zawsze możesz zrobić,
Object.getOwnPropertyNames(myObject).length
aby uzyskać taki sam wynik, jak w[].length
przypadku normalnej tablicy.źródło
Object.keys()
zwraca tablicę zawierającą nazwy tylko tych właściwości, które są policzalne. Jeśli chcesz tablicy z WSZYSTKIMI właściwościami, powinieneś użyćObject.getOwnPropertyNames()
zamiast niej. Zobacz developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Długość obiektu możemy znaleźć, używając:
źródło
Trochę późno do gry, ale dobrym sposobem na osiągnięcie tego (tylko IE9 +) jest zdefiniowanie magicznego gettera we właściwości length:
Możesz go po prostu użyć w następujący sposób:
Dałbym
1
.źródło
Poniżej znajduje się wersja odpowiedzi Jamesa Coglana w CoffeeScript dla tych, którzy porzucili prosty JavaScript :)
źródło
size++ for own key of obj
(own key
cukier składniowy w CoffeeScript). UżywaniehasOwnProperty
bezpośrednio z obiektu jest niebezpieczne, ponieważ psuje się, gdy obiekt faktycznie ma taką właściwość.