Jak przetestować pusty obiekt JavaScript?

3106

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?

falmp
źródło
7
Czy używasz skryptu JSON.js? Lub dowolna inna biblioteka JSON. Następnie możesz użyć funkcji JSON.encode () do konwersji var na string, a następnie przetestowania go.
Thevs
if( Object.entries(a).length > 0){ //do }
Muhammad Shahzad

Odpowiedzi:

5415

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

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

ExtJS

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

AngularJS (wersja 1)

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

Ramda

R.isEmpty({}); // true
Adam Zerner
źródło
22
Oto test wydajności między jQuery a podkreśleniem jsperf.com/isempty-vs-isemptyobject/6
Michaił
20
Object.keys(new Date()).length === 0; więc ta odpowiedź może wprowadzać w błąd.
cjbarth
6
Zamiast szufladkowania rzeczy możesz również skorzystać z tego faktu: (new Date()).constructor === Datelub odwrotnie ({}).constructor === Object.
John Nelson
2
angular.equals ({}, {});
Jeremy A. West,
11
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.constructormożna łatwo sfałszować. Przykład: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse,
862

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;
}
Christoph
źródło
56
Działa to dobrze lub prościej: function isEmpty (object) {for (var i in object) {return true; } return false; }
Nicholas Kreidberg
36
Czy w tej funkcji nie należy odwracać wartości prawda i fałsz?
namtax
25
@namtax: nie - funkcja jest nazwana isEmpty(), więc powinna zwrócić, falsejeśli ma właściwość
Christoph
6
pusty obiekt rozszerzy domyślną klasę Object, ale jeśli prototyp obiektu zostanie zmodyfikowany, twoja uproszczona funkcja zawiedzie: Object.prototype.a = 'hi'; var obj = {}; alert (obj.a); // wyprowadza „hi” isEmpty (obj) // zwraca false
venimus
29
Nie powinieneś używać drugiego przykładu, ponieważ jest to złożoność czasowa O (n) i złożoność przestrzenna O (n), podczas gdy pierwszym jest O (1).
Brian
572

Dla tych z was, którzy mają ten sam problem, ale używają jQuery, można użyć jQuery.isEmptyObject .

Erik Töyrä Silfverswärd
źródło
43
HEJ! Właśnie spędziłem kilka godzin na debugowaniu problemów z IE 8, aby stwierdzić, że przyczyną problemu był jQuery.isEmptyObject. Zwraca wartość true, jeśli obiekt jest pusty.
MFD3000,
162
Dlaczego publikujesz odpowiedź, w tym jQuery, jeśli pytanie w ogóle nie dotyczy jQuery?
Eru
47
Wiem, że to stary komentarz, ale zastanawiam się nad twoim pytaniem @ MFD3000, ponieważ docu mówi: zwraca true, jeśli obiekt jest pusty (jak wskazuje nazwa)
Александр Фишер
21
włączenie jQuery do tak podstawowego zadania nie jest tym, co nazwałbym właściwą odpowiedzią. To prawda, że ​​obecnie jQuery jest prawie wszechobecny, ale nie powinniśmy zapominać, że jest zbudowany wokół samego bardzo sprawnego języka.
Pablo Mescher
54
Typowe snobizm JS w tych komentarzach. Wszyscy wiedzą, że duża część kodu JavaScript w Internecie jest napisana w jQuery, więc jest całkowicie dopuszczalne, aby zapewnić rozwiązanie dla jQuery, jeśli ma już wbudowaną metodę testowania obiektów. Jest prawdopodobne, że tysiące programistów szukających pomocy uzna tę odpowiedź za pomocną. Nikt nie powiedział, że to jedyny sposób, aby to zrobić. underscore.js
Zauważam,
276

To jest moje preferowane rozwiązanie:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
dhruvio
źródło
1
Problem ze zgodnością z IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
doublejosh
3
@Jero Franzani: nie, nie robi
nikoskip
Długość Object.keys ({}). Jest 10 razy wolniejsza niż opcja (dla ... w ...) - sugeruję unikanie go jako sposobu na sprawdzenie, czy objetc jest pusty.
davidhadas
10
Object.keys(new Date()).length === 0; więc ta odpowiedź może wprowadzać w błąd.
cjbarth
new Date()nie jest przedmiotem. nd = new Date(); nd.constructor === Object;powoduje w false.
pors
204

Możesz użyć Underscore.js .

_.isEmpty({}); // true
Baggz
źródło
19
Lub możesz użyć lodash jest pusty ( lodash.com/docs#isEmpty ), ale czym to się różni od korzystania z rozwiązania jQuery - nadal musisz zainstalować dodatkową bibliotekę. Myślę, że intencją jest waniliowe rozwiązanie javascript.
tfmontague
10
Jest inaczej, jeśli chcesz używać JS na backendie z Node.js. Niewiele osób będzie chciało używać jQuery (biblioteka front-end używana głównie do manipulacji DOM) na backendie.
Nahn
3
Podkreślenie @tfmontague jest bardzo powszechne w aplikacjach węzłów, prawie tak wszechobecne jak jQ po stronie klienta.
Wymagałem
5
Podkreślenie jest zastępowane lodash. Użyj tego zamiast tego.
demisx
2
Wystarczy być ostrożnym z datą typów isEmpty zawsze zwracają prawdę o dzień, zobacz github.com/jashkenas/underscore/issues/445
Mentat
116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

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

es kolonia
źródło
5
Obejmuje to właściwości niepoliczalne, na wszelki wypadek.
Długość Object.getOwnPropertyNames ({}). Jest 10 razy wolniejsza niż opcja (dla ... w ...) - sugeruję unikanie go jako sposobu na sprawdzenie, czy objetc jest pusty.
davidhadas
4
Object.getOwnPropertyNames(new Date()).length === 0; więc ta odpowiedź może wprowadzać w błąd.
cjbarth
80

Co powiesz na użycie JSON.stringify? Jest prawie dostępny we wszystkich nowoczesnych przeglądarkach.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
Ateszki
źródło
23
return (JSON.stringify (obj) == '{}')
Vic
26
Jest to wolne i prędkość ma znaczenie dla tego rodzaju narzędzia. Szybki test perf tutaj: jsperf.com/empty-object-test
1
Jest to bardzo wolna opcja - sugeruję zamiast tego użyć opcji (dla ... w)
davidhadas
2
I to nie działa dla obiektów zawierających funkcje.
Felix Kling
1
Zgłasza również błąd, jeśli w obiekcie znajduje się odwołanie kołowe. Jest więc powolny, zawodny i może rzucać błędy i niszczyć wszystko inne. Nigdy nie ma powodu, aby go używać.
Burak
62

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

Anish Nair
źródło
4
Nie powiedzie się dla obiektów z referencjami cyklicznymi, ponieważ JSON.stringify specjalnie zgłasza dla nich wyjątek.
Pedro Montoto García,
1
@ PedroMontotoGarcía Ok i w jaki sposób pusty obiekt będzie miał okrągłe odniesienie?
KthProg
8
Jeśli obiekt nie jest pusty (i powinien również działać dla nich).
Pedro Montoto García
Wydaje się, że @Ateszki już o tym wspomniało i jest to jeden z najwolniejszych sposobów sprawdzenia, czy obiekt nie jest pusty.
cwadding
O tak .. Przegapiłem to. Natknąłem się na sytuację, w której chciałem uzyskać ten skrypt javascript i po chwili namysłu pomyślałem o tym. @Ateszki, nawet ja tak myślałem. :-) Przy okazji, było wiele odpowiedzi na ten temat, więc przegapiłem twoją odpowiedź.
Anish Nair,
60

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;
}
Jonathan Petitcolas
źródło
5
Jest to przydatne tylko wtedy, gdy jakiś inny proces nie dodał prototypu do obiektu podstawowego. Aby to naprawdę było wykonalne, musisz przetestować na obj.hasOwnProperty (name)
mpemburn
1
Nie ma to nic wspólnego z odpowiedzią Christopha z 2009 r.
Dan Dascalescu,
39

Istnieje prosty sposób, jeśli korzystasz z nowszej przeglądarki. Object.keys(obj).length == 0

Ściągnij
źródło
1
Skąd keyspochodzi nieruchomość?
2
Jest to standardowa metoda w ECMAScript 5.1
pobierz
1
Jak powyższy komentarz może mieć 4 głosy poparcia? Tak, Object.keysjest 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 keyo wartości, która ponownie jako właściwość o nazwie innej lengthniż zero. Okropny!
scravy,
Object.keys(new Date()).length === 0; więc ta odpowiedź może wprowadzać w błąd.
cjbarth
11
@scravy Object to obiekt klasy. Obiekt ma metodę statyczną o nazwie „klucze”, która przyjmuje obiekt jako argument. Ta metoda zwraca tablicę ciągów, w których ciągi są nazwami właściwości. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sgnl
33

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:

  • (dla ... za ...) to najszybsza opcja do użycia!
  • Object.keys (obj) .length jest 10 razy wolniejszy dla pustych obiektów
  • JSON.stringify (obj) .length jest zawsze najwolniejszy (nie dziwi)
  • Object.getOwnPropertyNames (obj) .length trwa dłużej niż Object.keys (obj) .length może być znacznie dłuższy w niektórych systemach.

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?

davidhadas
źródło
Object.keysjest 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?
yankee
33

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

  • rozwiązania oparte na for-in(A, J, L, M) są najszybsze
  • rozwiązania oparte na JSON.stringify(B, K) są powolne
  • nieoczekiwanie również rozwiązanie oparte na Object(N) jest wolne

wprowadź opis zdjęcia tutaj

Detale

Poniżej we fragmencie znajduje się 15 rozwiązań. Jeśli chcesz uruchomić test wydajności na swoim komputerze, kliknij TUTAJ .

wprowadź opis zdjęcia tutaj

Kamil Kiełczewski
źródło
wiele z tego nie ma sensu, ponieważ wszystko opierasz na zwrocie fałszu lub prawdy. Czasami programowanie wymaga instrukcji if lub potrójnego operatora. just fyi
Christian Matthew
To najlepsza odpowiedź, dziękuję, pierwsze rozwiązanie działa jak urok
Carlos Jesus Arancibia Taborga
32

Możesz sprawdzić liczbę kluczy Object:

if (Object.keys(a).length > 0) {
    // not empty
}
Ashutosh Ranjan
źródło
8
Dlaczego miałbyś dodawać komentarz do udzielonej odpowiedzi i dać gorszą odpowiedź? stackoverflow.com/a/32108184/4229159 i jest to pierwsza odpowiedź od kwietnia
Alejandro Vales
Jak mam mieć bardzo duży obiekt i zrobić to w każdej pętli, aby zobaczyć, czy obiekt jest pusty?
StefansArya
27
  1. 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.

  2. 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.

Thevs
źródło
6
toSource()jest niestandardowy i nie działa w IE ani w Operze (i potencjalnie w innych przeglądarkach, których nie sprawdziłem)
Christoph
4
@Thevs: być może masz inną kopię bieżącej wersji ECMA-262, ale moja nie zawiera toSourcewł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!
Christoph
4
@Thevs: cóż, co najmniej 2 ważnych dostawców przeglądarki nie wdrożyło go, więc nie jest to de facto standard, a ponieważ nie ma go w ECMA-262, nie jest też prawdziwy ...
Christoph
4
Nawet gdy to działa, 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.
Jasper,
4
@Thevs, koszty ogólne są większe, nawet jeśli mogą być (nie jestem pewien, że w każdych okolicznościach) tego samego rzędu wielkości. Jednak odpowiedź ta polega na zwróceniu wartości false, gdy tylko zostanie znaleziona inna właściwość, która sprawia, że ​​historia jest inna razem ...
Jasper
25

Utworzyłem pełną funkcję, aby ustalić, czy obiekt jest pusty.

Korzysta Object.keysz 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

/**
 * 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!

Slava Fomin II
źródło
3
Nie udaje się to dla nullobiektu.
Cześć @torazaburo! Dzięki za powiadomienie! Zaktualizowałem wszystkie źródła z poprawną implementacją.
Slava Fomin II
1
Długość Object.keys ({}). Jest 10 razy wolniejsza niż opcja (dla ... w ...) - sugeruję unikanie go jako sposobu na sprawdzenie, czy objetc jest pusty.
davidhadas
1
Object.keys(new Date()).length === 0; więc ta odpowiedź może wprowadzać w błąd.
cjbarth
19

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;

stąd

Aktualizacja

LUB

możesz użyć implementacji jQuery isEmptyObject

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}
kiranvj
źródło
cześć. podczas testowania tej funkcji za pomocą liczby lub wartości logicznej true lub false return true i nie jest to poprawny wynik. isObjectEmpty (true). isObjectEmpty (false). isObjectEmpty (1)
iman
2
Sprawdzamy, czy obiekt jest pusty, a nie jeśli typ danych to obiekt. W twoim przypadku, aby sprawdzić, czy jest to obiekt, potrzebujemy czegoś takiego, jak if (typeof a === "object") {...}
kiranvj
15

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

GibboK
źródło
14

Zgodnie ze specyfikacją ES2017 dotyczącą Object.entries () sprawdzenie jest proste przy użyciu dowolnej nowoczesnej przeglądarki -

Object.entries({}).length === 0
Vikrant
źródło
3
Czy istnieją jakieś korzyści przy użyciu nad tym Object.keysczy Object.values?
faintsignal
@faintsignal przy użyciu tych są całkowicie w porządku. Właśnie dodałem wpisy, których nie znalazłem w komentarzach.
Vikrant
13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
Lekkość Wyścigi na orbicie
źródło
4
To zgłosi również prawdę, gdy na przykład biblioteka JavaScript rozszerza Objectsię o metodę poprzez łańcuch prototypów, ponieważ jest to wyliczalna, a for ininstrukcja zapętla się przez wyliczalne właściwości.
viam0Zah
12

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/


źródło
12

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])
Tudor Morar
źródło
1
co jeśli pierwszy klucz zwróci falsewartość? wynik będzie falsenieprawidłowy.
Jimmy Obonyo Abor,
Testowałem na to. Czy możesz podać działający przykład?
Tudor Morar,
1
jest to krótkie i zwięzłe, ale spowoduje błąd w czasie wykonywania, jeśli obiekt nie zostanie zdefiniowany
Mrinmoy
11

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.Keysmetody, 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
ahmadalibaloch
źródło
Chociaż jest poprawny jako dziwny sposób na wykonanie instrukcji if - prawdopodobnie pomyli kogoś, kto zachowa kod za tobą.
Soren
10


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
iman
źródło
JSON.stringifyrozwią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.
10

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
DiegoAraujo
źródło
3
Powiedziałbym, że 0 nie jest puste, ponieważ w rzeczywistości jest liczbą. wszystko inne wygląda dobrze, ale naprawa jest łatwa. w pierwszej instrukcji if dodaj to. if (!obj && obj !== 0).
mjwrazor
9

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.

NiKo
źródło
2
Object.keys(new Date()).length === 0; więc ta odpowiedź może wprowadzać w błąd.
cjbarth
3
Zależy, jeśli uważasz, że data jest zawsze „pełna”, mimo że nigdy nie ujawniasz kluczy. Ale zgadzam się, że jeśli taki jest twój plan, dobrym rozwiązaniem jest dodanie dodatkowej instancji sprawdzania konstruktora daty.
NiKo,
9

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ź.

jichi
źródło
Podkreślenie zostało już wspomniane w odpowiedzi kilka lat wcześniej .
Dan Dascalescu
7

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

    {}
Ekim
źródło
7

Poprawna odpowiedź to:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

To sprawdza, czy:

  • Obiekt nie ma własnych właściwości (niezależnie od wyliczalności).
  • Obiekt nie ma własnych symboli właściwości.
  • Prototyp obiektu jest dokładnie taki Object.prototype.

Innymi słowy, obiekt jest nierozróżnialny od obiektu utworzonego za pomocą {}.

Jesse
źródło
6

Oprócz odpowiedzi Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

to jquery + jquery.json

starikovs
źródło
Nie lubię używać JSON, ponieważ nie może pracować z okrągłymi strukturami obiektów.
itdoesntwork
2
Jeśli strona ładuje jQuery, użyj $.isEmptyObject(), nie marnuj cykli na nieoczywiste konwersje.
narciarzy
6

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()
mikemaccana
źródło