Pytanie Jak przetestować pusty obiekt JavaScript?


Po żądaniu AJAX czasami moja aplikacja może zwrócić pusty obiekt, na przykład:

var a = {};

Jak mogę sprawdzić, czy tak jest?


1874
2018-03-25 01:39


pochodzenie


Czy używasz skryptu JSON.js? Lub dowolną inną bibliotekę JSON. Następnie możesz użyć funkcji JSON.encode (), aby przekonwertować var ​​na ciąg, a następnie przetestować go. - Thevs


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

Wstępne 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

lać:

_.isEmpty({}); // true

Podkreślać:

_.isEmpty({}); // true

Hoek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (wersja 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true

3088
2018-03-25 01:49



Oto test wydajności między jQuery i podkreślnikiem jsperf.com/isempty-vs-isemptyobject/6 - Mikhail
Object.keys(new Date()).length === 0; więc ta odpowiedź może być myląca. - cjbarth
Zamiast szarpania rzeczy możesz również skorzystać z tego faktu: (new Date()).constructor === Datelub odwrotnie ({}).constructor === Object. - John Nelson
angular.equals ({}, {}); - Jeremy A. West
Object.keys() nie sprawdza właściwości lub symboli nieprzeliczalnych. Musisz użyć Object.getOwnPropertyNames() i Object.getOwnPropertySymbols() zamiast. Również, Object.getPrototypeOf() jest poprawnym sposobem uzyskania prototypu obiektu. obj.constructor można łatwo sfałszować. Przykład: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true. - Jesse


Nie ma prostego sposobu na zrobienie tego. Konieczne będzie jawne przerzucenie właściwości:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

Gdyby Obsługa ECMAScript 5 jest dostępna, możesz użyć Object.keys() zamiast:

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}

747
2018-05-19 14:07



Działa to dobrze, lub po prostu: function isEmpty (object) {for (var i in object) {return true; } return false; } - Nicholas Kreidberg
Czy w tej funkcji nie można odwrócić wartości true i false? - namtax
@namtax: no - nazwa funkcji isEmpty(), więc powinien powrócić false jeśli ma właściwość - Christoph
pusty obiekt rozszerzy domyślną klasę Object, ale jeśli prototyp obiektu zostanie zmodyfikowany, twoja uproszczona funkcja nie powiedzie się: Object.prototype.a = 'hi'; var obj = {}; alert (obj.a); // wyświetla "hi" isEmpty (obj) // zwraca wartość false - venimus
Nie powinieneś używać drugiego przykładu, ponieważ jest to złożoność O (n) czasu i złożoność O (n), podczas gdy pierwsza to O (1). - Brian


Dla tych, którzy mają ten sam problem, ale używa jQuery, możesz użyć jQuery.isEmptyObject.


539
2018-03-22 20:35



HEJ! Właśnie spędziłem kilka godzin na debugowaniu problemów związanych z IE 8, aby stwierdzić, że przyczyną problemu był plik jQuery.isEmptyObject. Zwraca wartość true, jeśli obiekt jest pusty. - MFD3000
Dlaczego publikujesz odpowiedź, w tym jQuery, jeśli w ogóle nie chodzi o jQuery? - Eru
Znam jego stary komentarz, ale zastanawiam się nad twoim pytaniem @ MFD3000, ponieważ dokument mówi: zwraca true, jeśli obiekt jest pusty (jak wskazuje nazwa) - Александр Фишер
w tym jQuery dla tak podstawowego zadania nie jest tym, co nazwałbym właściwą odpowiedzią. To prawda, że ​​w dzisiejszych czasach jQuery jest niemalże wszechobecna, ale nadal nie powinniśmy zapominać, że jest zbudowany wokół bardzo dobrego języka. - Pablo Mescher
Typowy snobizm JS w tych komentarzach. Wszyscy wiedzą, że znaczna część kodu JavaScript w Internecie jest napisana w jQuery, więc jest całkowicie dopuszczalne dostarczenie rozwiązania tutaj dla jQuery, jeśli ma już wbudowaną metodę testowania obiektów. Prawdopodobnie tysiące programistów szukających pomocy uzna tę odpowiedź za pomocną. Nikt nie powiedział, że to jedyny sposób, aby to zrobić. Zauważam, że nikt nie zachowuje się tak elitarnie w stosunku do faceta, który opublikował rozwiązanie do użycia underscore.js... - BadHorsie


Możesz użyć Underscore.js.

_.isEmpty({}); // true

184
2017-07-12 07:46



Lub możesz użyć LASZAM jest pusty (lodash.com/docs#isEmpty), ale jak to się różni od korzystania z rozwiązania jQuery - nadal musisz zainstalować dodatkową bibliotekę. Myślę, że rozwiązaniem jest rozwiązanie z javascriptem wanilii. - tfmontague
Inaczej jest, jeśli chcesz używać JS na zapleczu za pomocą Node.js. Niewiele osób będzie chciało używać jQuery (biblioteki front-endowej używanej głównie do manipulacji DOM) na zapleczu. - Nahn
@tfmontague podkreślenie jest bardzo powszechne w aplikacjach węzłowych, prawie tak samo wszechobecne jak jQ po stronie klienta. Już miałem podkreślenie wymagane, ale nie zdawałem sobie sprawy, że ma tę funkcję - rw-nandemo
Podkreślnik zastępowany jest przez lodash. Użyj zamiast tego. - demisx
Po prostu uważaj na typy Date, isEmpty zawsze zwraca true dla Date, see github.com/jashkenas/underscore/issues/445 - mentat


To jest moje preferowane rozwiązanie:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

181
2017-11-06 13:48



Problem kompatybilności z IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - doublejosh
czy to rozwiązanie działa z ie8? - Jero Franzani
@Jero Franzani: nie, nie - nikoskip
Długość Object.keys ({}) jest 10 razy wolniejsza niż opcja (dla ... w ...) - Proponuję unikać tego jako sposobu na sprawdzenie, czy objetc jest pusty. - davidhadas
Object.keys(new Date()).length === 0; więc ta odpowiedź może być myląca. - cjbarth


if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

widzieć http://bencollier.net/2011/04/javascript-is-an-object-empty/ 


103
2018-01-23 20:07



To nie działa w IE8 i poniżej. - Stilltorik
Obejmuje to nieprzeliczalne właściwości, na wszelki wypadek.
Długość Object.getOwnPropertyNames ({}). Jest 10 razy wolniejsza niż opcja (dla ... w ...) - Proponuję unikać tego jako sposobu na sprawdzenie, czy objetc jest pusty. - davidhadas
Object.getOwnPropertyNames(new Date()).length === 0; więc ta odpowiedź może być myląca. - cjbarth


Jak o użyciu JSON.stringify? Jest prawie dostępny we wszystkich nowoczesnych przeglądarkach.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

62
2018-01-31 10:55



return (JSON.stringify (obj) == '{}') - Vic
Jest to powolne i szybkość ma znaczenie dla tego rodzaju użyteczności. Szybki test perfekcyjny tutaj: jsperf.com/empty-object-test - rur
Jest to bardzo powolna opcja - proponuję zamiast tego użyć opcji (dla ... w) - davidhadas
I nie działa dla obiektów, które zawierają funkcje. - Felix Kling


Stare pytanie, ale po prostu miał problem. Włączenie JQuery nie jest dobrym pomysłem, jeśli Twoim jedynym celem jest sprawdzenie, czy obiekt nie jest pusty. Zamiast tego, po prostu głęboko Kod JQuery, a otrzymasz odpowiedź:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

51
2017-09-22 05:38



Jest to użyteczne tylko wtedy, gdy inny proces nie dodał prototypu do twojego podstawowego obiektu. Aby było to naprawdę wykonalne, musisz przetestować pod kątem obj.hasOwnProperty (name) - mpemburn


Po prostu wpadłem na podobną sytuację. Nie chciałem używać JQuery i chciałem to zrobić za pomocą czystej wersji Javascript.

I zrobiłem to, użyłem następującego warunku 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 być równym, użyj tego: JSON.stringify(obj) !== '{}'

Sprawdź to JSFiddle


42
2018-04-29 19:25



Nie powiedzie się dla obiektów z odwołaniami cyklicznymi, ponieważ JSON.stringify specjalnie zgłasza wyjątek dla nich. - Pedro Montoto García
@ PedroMontotoGarcía Ok i jak pusty obiekt będzie miał odwołanie cykliczne? - KthProg
Jeśli obiekt nie jest pusty (i powinien działać również dla nich). - Pedro Montoto García
Wydaje się, że zostało to już wspomniane przez @Ateszki i jest jednym z najwolniejszych sposobów sprawdzenia, czy obiekt nie jest pusty. - cwadding
O tak ... tęskniłem za tym. Natknąłem się na sytuację, w której chciałem osiągnąć ten javascript i po odrobinie myślenia udało mi się dojść do tego w ten sposób. @Ateszki, Nawet ja tak jak ty. :-) Przy okazji, było na to wiele odpowiedzi, więc przegapiłem twoją odpowiedź. - Anish Nair