Po żądaniu AJAX czasami moja aplikacja może zwrócić pusty obiekt, na przykład:
var a = {};
Jak mogę sprawdzić, czy tak jest w przypadku?
Po żądaniu AJAX czasami moja aplikacja może zwrócić pusty obiekt, na przykład:
var a = {};
Jak mogę sprawdzić, czy tak jest w przypadku?
if( Object.entries(a).length > 0){ //do }
Odpowiedzi:
ECMA 5+ :
Należy jednak pamiętać, że tworzy to niepotrzebną tablicę (zwracana wartość
keys
).Pre-ECMA 5:
jQuery :
lodash :
Podkreśl :
Hoek
ExtJS
AngularJS (wersja 1)
Ramda
źródło
Object.keys(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.(new Date()).constructor === Date
lub odwrotnie({}).constructor === Object
.Object.keys()
nie sprawdza właściwości lub symboli niepoliczalnych. Musisz użyćObject.getOwnPropertyNames()
iObject.getOwnPropertySymbols()
zamiast tego. Ponadto,Object.getPrototypeOf()
jest poprawny sposób uzyskać prototyp obiektu.obj.constructor
można łatwo sfałszować. Przykład:function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.Nie ma na to łatwego sposobu. Musisz jawnie zapętlić właściwości:
Jeśli dostępna jest obsługa ECMAScript 5 , możesz
Object.keys()
zamiast tego użyć :źródło
isEmpty()
, więc powinna zwrócić,false
jeśli ma właściwośćDla tych z was, którzy mają ten sam problem, ale używają jQuery, można użyć jQuery.isEmptyObject .
źródło
underscore.js
To jest moje preferowane rozwiązanie:
źródło
Object.keys(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.new Date()
nie jest przedmiotem.nd = new Date(); nd.constructor === Object;
powoduje wfalse
.Możesz użyć Underscore.js .
źródło
patrz http://bencollier.net/2011/04/javascript-is-an-object-empty/
źródło
Object.getOwnPropertyNames(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.Co powiesz na użycie JSON.stringify? Jest prawie dostępny we wszystkich nowoczesnych przeglądarkach.
źródło
Właśnie spotkałem podobną sytuację. Nie chciałem używać JQuery i chciałem to zrobić przy użyciu czystego Javascript.
I to, co zrobiłem, zastosowałem następujący warunek i zadziałało to dla mnie.
Aby nie równać się, użyj tego:
JSON.stringify(obj) !== '{}'
Sprawdź to JSFiddle
źródło
Stare pytanie, ale właśnie problem. Dołączenie JQuery nie jest dobrym pomysłem, jeśli jedynym celem jest sprawdzenie, czy obiekt nie jest pusty. Zamiast tego po prostu wejdź głęboko w kod JQuery , a otrzymasz odpowiedź:
źródło
Istnieje prosty sposób, jeśli korzystasz z nowszej przeglądarki.
Object.keys(obj).length == 0
źródło
keys
pochodzi nieruchomość?Object.keys
jest standardową metodą, ale obiekty nie mają właściwości keys. Tak więc ten kod zgłosi, że każdy obiekt jest pusty, z tym że przypadkowo ma on właściwość o nazwiekey
o wartości, która ponownie jako właściwość o nazwie innejlength
niż zero. Okropny!Object.keys(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.Korzystanie z Object.keys (obj) .length (jak sugerowano powyżej dla ECMA 5+) jest 10 razy wolniejsze dla pustych obiektów! zachowaj przy opcji old school (dla ... w).
Testowane pod Node, Chrome, Firefox i IE 9, staje się oczywiste, że w większości przypadków użycia:
Jeśli chodzi o wydajność, użyj:
lub
Zobacz szczegółowe wyniki testów i kod testu na stronie Czy obiekt jest pusty?
źródło
Object.keys
jest wolny, ale mniej kodu. Na małej stronie, gdzie to się nazywa ... może 10 razy ... Czy to będzie jeszcze wolniejsze, biorąc pod uwagę dodatkowy czas analizy dodatkowego kodu?Wydajność
Dzisiaj 2020.01.17 wykonuję testy na MacOs HighSierra 10.13.6 na Chrome v79.0, Safari v13.0.4 i Firefox v72.0 dla wybranych rozwiązań.
Wnioski
for-in
(A, J, L, M) są najszybszeJSON.stringify
(B, K) są powolneObject
(N) jest wolneDetale
Poniżej we fragmencie znajduje się 15 rozwiązań. Jeśli chcesz uruchomić test wydajności na swoim komputerze, kliknij TUTAJ .
Pokaż fragment kodu
źródło
Możesz sprawdzić liczbę kluczy Object:
źródło
Tylko obejście. Czy Twój serwer może wygenerować jakąś specjalną właściwość w przypadku braku danych?
Na przykład:
Następnie możesz łatwo sprawdzić to w swoim kodzie zwrotnym AJAX.
Inny sposób, aby to sprawdzić:
EDYCJA : Jeśli używasz dowolnej biblioteki JSON (np. JSON.js), możesz wypróbować funkcję JSON.encode () i przetestować wynik na pustym ciągu wartości.
źródło
toSource()
jest niestandardowy i nie działa w IE ani w Operze (i potencjalnie w innych przeglądarkach, których nie sprawdziłem)toSource
właściwości w sekcji 15.2.4; według MDC został wprowadzony w JS1.3 (tj. Netscape Navigator 4.06), ale NIE jest w ECMA-262, 3. edycja!toSource()
jest to okropny sposób na zrobienie tego (tak jak jestJSON.encode()
). Musi zbudować ciąg reprezentujący cały obiekt, aby sprawdzić, czy jest pusty. Konwersja rzeczy na ciągi jest narzutem, ale ponadto trzeba będzie przekonwertować milion rzeczy, jeśli obiekt ma milion właściwości, a samo patrzenie na jedną da ci znać, że nie jest pusta.Utworzyłem pełną funkcję, aby ustalić, czy obiekt jest pusty.
Korzysta
Object.keys
z funkcji ECMAScript 5 (ES5), jeśli to możliwe, aby osiągnąć najlepszą wydajność (patrz tabela kompatybilności ) i wrócić do najbardziej kompatybilnego podejścia dla starszych silników (przeglądarek).Rozwiązanie
Oto treść tego kodu.
A oto JSFiddle z demonstracją i prostym testem.
Mam nadzieję, że to komuś pomoże. Twoje zdrowie!
źródło
null
obiektu.Object.keys(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.Używam tego.
Na przykład:
stąd
Aktualizacja
LUB
możesz użyć implementacji jQuery isEmptyObject
źródło
Poniższy przykład pokazuje, jak sprawdzić, czy obiekt JavaScript jest pusty, jeśli przez pusty oznacza to, że nie ma własnych właściwości.
Skrypt działa na ES6.
źródło
źródło
Object.keys
czyObject.values
?źródło
Object
się o metodę poprzez łańcuch prototypów, ponieważ jest to wyliczalna, afor in
instrukcja zapętla się przez wyliczalne właściwości.jQuery ma specjalną funkcję
isEmptyObject()
dla tego przypadku:Czytaj więcej na http://api.jquery.com/jQuery.isEmptyObject/
źródło
Chciałbym sprawdzić, czy ma co najmniej jeden klucz. Wystarczyłoby mi powiedzieć, że nie jest pusty.
źródło
false
wartość? wynik będziefalse
nieprawidłowy.Pod maską wszystkie puste metody sprawdzania we wszystkich bibliotekach używają logiki sprawdzania kluczy obiektowych. Jest to dziwny sposób, aby uczynić go zrozumiałym, który można zastosować w metodzie opisanej tutaj .
Co ewoluowało w ES5 , teraz po prostu możesz sprawdzić długość kluczy obiektu, używając
Object.Keys
metody, która bierze twój obiekt jako parametr:Lub jeśli używasz Lodash (musisz być), to.
źródło
możesz użyć tego prostego kodu, który nie korzystał z jQuery ani innych bibliotek
Klasa JSON i jej funkcje ( parsowanie i stringify ) są bardzo przydatne, ale mają pewne problemy z IE7 , które można naprawić za pomocą tego prostego kodu http://www.json.org/js.html .
Inny prosty sposób (najprostszy sposób):
możesz używać w ten sposób bez użycia jQuery lub obiektu JSON .
źródło
JSON.stringify
rozwiązanie kończy się niepowodzeniem, jeśli obiekt zawiera właściwości nieściągliwe, takie jak funkcje lub „niezdefiniowane”, chociaż przyznane, że jest to przypadek skrajny.Najlepszy sposób, jaki znalazłem:
Pracuje dla:
źródło
if (!obj && obj !== 0)
.Moje podanie:
Po prostu nie sądzę, że wszystkie przeglądarki implementują
Object.keys()
obecnie.źródło
Object.keys(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.Jeśli jQuery i przeglądarka internetowa nie są dostępne, w underscore.js jest również funkcja isEmpty.
Ponadto nie zakłada, że parametr wejściowy jest obiektem. W przypadku listy lub ciągu znaków lub niezdefiniowanej zmieni również poprawną odpowiedź.
źródło
Zastrzeżenie! Uważaj na ograniczenia JSON.
wyświetla
źródło
Poprawna odpowiedź to:
To sprawdza, czy:
Object.prototype
.Innymi słowy, obiekt jest nierozróżnialny od obiektu utworzonego za pomocą
{}
.źródło
Oprócz odpowiedzi Thevs:
to jquery + jquery.json
źródło
$.isEmptyObject()
, nie marnuj cykli na nieoczywiste konwersje.Sugar.JS zapewnia do tego celu rozszerzone obiekty. Kod jest czysty i prosty:
Zrób rozszerzony obiekt:
Sprawdź jego rozmiar:
źródło