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 }
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+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
Należy jednak pamiętać, że tworzy to niepotrzebną tablicę (zwracana wartość keys
).
Pre-ECMA 5:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery :
jQuery.isEmptyObject({}); // true
lodash :
_.isEmpty({}); // true
Podkreśl :
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
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()
i Object.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:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
Jeśli dostępna jest obsługa ECMAScript 5 , możesz Object.keys()
zamiast tego użyć :
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
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 .
underscore.js
To jest moje preferowane rozwiązanie:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
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 w false
.
Możesz użyć Underscore.js .
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
patrz http://bencollier.net/2011/04/javascript-is-an-object-empty/
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.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
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.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
Aby nie równać się, użyj tego: JSON.stringify(obj) !== '{}'
Sprawdź to JSFiddle
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ź:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
Istnieje prosty sposób, jeśli korzystasz z nowszej przeglądarki.
Object.keys(obj).length == 0
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 nazwie key
o wartości, która ponownie jako właściwość o nazwie innej length
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:
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
lub
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
Zobacz szczegółowe wyniki testów i kod testu na stronie Czy obiekt jest pusty?
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?
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 wolnePoniżej we fragmencie znajduje się 15 rozwiązań. Jeśli chcesz uruchomić test wydajności na swoim komputerze, kliknij TUTAJ .
Możesz sprawdzić liczbę kluczy Object:
if (Object.keys(a).length > 0) {
// not empty
}
Tylko obejście. Czy Twój serwer może wygenerować jakąś specjalną właściwość w przypadku braku danych?
Na przykład:
var a = {empty:true};
Następnie możesz łatwo sprawdzić to w swoim kodzie zwrotnym AJAX.
Inny sposób, aby to sprawdzić:
if (a.toSource() === "({})") // then 'a' is empty
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.
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 jest JSON.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).
/**
* Returns true if specified object has no properties,
* false otherwise.
*
* @param {object} object
* @returns {boolean}
*/
function isObjectEmpty(object)
{
if ('object' !== typeof object) {
throw new Error('Object must be specified.');
}
if (null === object) {
return true;
}
if ('undefined' !== Object.keys) {
// Using ECMAScript 5 feature.
return (0 === Object.keys(object).length);
} else {
// Using legacy compatibility mode.
for (var key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
}
}
Oto treść tego kodu.
A oto JSFiddle z demonstracją i prostym testem.
Mam nadzieję, że to komuś pomoże. Twoje zdrowie!
Object.keys(new Date()).length === 0
; więc ta odpowiedź może wprowadzać w błąd.
Używam tego.
function isObjectEmpty(object) {
var isEmpty = true;
for (keys in object) {
isEmpty = false;
break; // exiting since we found that the object is not empty
}
return isEmpty;
}
Na przykład:
var myObject = {}; // Object is empty
var isEmpty = isObjectEmpty(myObject); // will return true;
// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"};
// check if the object is empty
isEmpty = isObjectEmpty(myObject); // will return false;
Aktualizacja
LUB
możesz użyć implementacji jQuery isEmptyObject
function isEmptyObject(obj) {
var name;
for (name in obj) {
return false;
}
return true;
}
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.
const isEmpty = (obj) => {
if (obj === null ||
obj === undefined ||
Array.isArray(obj) ||
typeof obj !== 'object'
) {
return true;
}
return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty('')); // true
console.log(isEmpty(33)); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello')); // true
console.log(isEmpty([1, 2, 3])); // true
console.log(isEmpty({ test: 1 })); // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date())); // true
console.log(isEmpty(Infinity)); // true
console.log(isEmpty(null)); // true
console.log(isEmpty(undefined)); // true
Zgodnie ze specyfikacją ES2017 dotyczącą Object.entries () sprawdzenie jest proste przy użyciu dowolnej nowoczesnej przeglądarki -
Object.entries({}).length === 0
Object.keys
czy Object.values
?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
się o metodę poprzez łańcuch prototypów, ponieważ jest to wyliczalna, a for in
instrukcja zapętla się przez wyliczalne właściwości.
jQuery ma specjalną funkcję isEmptyObject()
dla tego przypadku:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
Czytaj więcej na http://api.jquery.com/jQuery.isEmptyObject/
Chciałbym sprawdzić, czy ma co najmniej jeden klucz. Wystarczyłoby mi powiedzieć, że nie jest pusty.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
wartość? wynik będzie false
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 .
for(key in obj){
//your work here.
break;
}
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:
if(Object.keys(obj).length > 0){
//do your work here
}
Lub jeśli używasz Lodash (musisz być), to.
_.isEmpty(obj) //==true or false
możesz użyć tego prostego kodu, który nie korzystał z jQuery ani innych bibliotek
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
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 .
var a=({});
function isEmptyObject(obj) {
if(typeof obj!='object') {
//it is not object, so is not empty
return false;
} else {
var x,i=0;
for(x in obj) {
i++;
}
if(i>0) {
//this object has some properties or methods
return false;
} else {
//this object has not any property or method
return true;
}
}
}
alert(isEmptyObject(a)); //true is alerted
Najlepszy sposób, jaki znalazłem:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
Pracuje dla:
t1: {} -> true
t2: {0:1} -: false
t3: [] -> true
t4: [2] -> false
t5: null -> true
t6: undefined -> true
t7: "" -> true
t8: "a" -> false
t9: 0 -> true
t10: 1 -> false
if (!obj && obj !== 0)
.
Moje podanie:
function isEmpty(obj) {
return !Object.keys(obj).length > 0;
}
var a = {a:1, b:2}
var b = {}
console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true
Po prostu nie sądzę, że wszystkie przeglądarki implementują Object.keys()
obecnie.
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.
_.isEmpty({}) // returns true
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ź.
Zastrzeżenie! Uważaj na ograniczenia JSON.
javascript:
obj={ f:function(){} };
alert( "Beware!! obj is NOT empty!\n\nobj = { f:function(){} }" +
"\n\nJSON.stringify( obj )\n\nreturns\n\n" +
JSON.stringify( obj ) );
wyświetla
Strzec się!! obj NIE jest pusty! obj = {f: function () {}} JSON.stringify (obj) zwroty {}
Poprawna odpowiedź to:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
To sprawdza, czy:
Object.prototype
.Innymi słowy, obiekt jest nierozróżnialny od obiektu utworzonego za pomocą {}
.
Oprócz odpowiedzi Thevs:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
to jquery + jquery.json
$.isEmptyObject()
, nie marnuj cykli na nieoczywiste konwersje.
Sugar.JS zapewnia do tego celu rozszerzone obiekty. Kod jest czysty i prosty:
Zrób rozszerzony obiekt:
a = Object.extended({})
Sprawdź jego rozmiar:
a.size()