Wie teste ich auf ein leeres JavaScript-Objekt?

3110

Nach einer AJAX-Anforderung gibt meine Anwendung manchmal ein leeres Objekt zurück, z.

var a = {};

Wie kann ich überprüfen, ob dies der Fall ist?

falmp
quelle
7
Verwenden Sie das Skript JSON.js? Oder eine andere JSON-Bibliothek. Anschließend können Sie die Funktion JSON.encode () verwenden, um var in string zu konvertieren und anschließend zu testen.
Thevs
if( Object.entries(a).length > 0){ //do }
Muhammad Shahzad

Antworten:

5424

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

Beachten Sie jedoch, dass dadurch ein unnötiges Array erstellt wird (der Rückgabewert von 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

Unterstreichen :

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS (Version 1)

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

Ramda

R.isEmpty({}); // true
Adam Zerner
quelle
22
Hier ist Leistungstest zwischen jQuery und Unterstrich jsperf.com/isempty-vs-isemptyobject/6
Mikhail
20
Object.keys(new Date()).length === 0;; Diese Antwort kann also irreführend sein.
CJBarth
6
Anstatt Dinge zu fädeln, können Sie auch diese Tatsache ausnutzen: (new Date()).constructor === Dateoder umgekehrt ({}).constructor === Object.
John Nelson
2
angle.equals ({}, {});
Jeremy A. West
11
Object.keys()prüft keine nicht aufzählbaren Eigenschaften oder Symbole. Sie müssen Object.getOwnPropertyNames()und Object.getOwnPropertySymbols()stattdessen verwenden. Dies Object.getPrototypeOf()ist auch der richtige Weg, um den Prototyp eines Objekts zu erhalten. obj.constructorkann leicht geschmiedet werden. Beispiel : function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse
863

Es gibt keine einfache Möglichkeit, dies zu tun. Sie müssen die Eigenschaften explizit durchlaufen:

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

    return true;
}

Wenn ECMAScript 5-Unterstützung verfügbar ist, können Sie Object.keys()stattdessen Folgendes verwenden :

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}
Christoph
quelle
56
Dies funktioniert gut oder einfacher: Funktion isEmpty (Objekt) {für (var i im Objekt) {return true; } falsch zurückgeben; }
Nicholas Kreidberg
36
Sollten in dieser Funktion nicht wahr und falsch umgekehrt werden?
Namtax
25
@namtax: nein - die Funktion ist benannt isEmpty(), sollte also zurückkehren, falsewenn sie eine Eigenschaft hat
Christoph
6
Ein leeres Objekt erweitert die Standardobjektklasse. Wenn jedoch der Objektprototyp geändert wird, schlägt Ihre vereinfachte Funktion fehl. Beachten Sie Folgendes: Object.prototype.a = 'hi'; var obj = {}; alert (obj.a); // gibt "hi" isEmpty (obj) aus // gibt false zurück
venimus
29
Sie sollten das zweite Beispiel nicht verwenden, da es sich um O (n) Zeitkomplexität und O (n) Raumkomplexität handelt, während das erste O (1) ist.
Brian
572

Für diejenigen unter Ihnen, die das gleiche Problem haben, aber jQuery verwenden, können Sie jQuery.isEmptyObject verwenden .

Erik Töyrä Silfverswärd
quelle
43
HALLO! Ich habe nur ein paar Stunden damit verbracht, IE 8-Probleme zu debuggen, nur um festzustellen, dass es jQuery.isEmptyObject war, das das Problem verursachte. Es gibt true zurück, wenn das Objekt leer ist.
MFD3000
162
Warum posten Sie eine Antwort einschließlich jQuery, wenn es bei der Frage überhaupt nicht um jQuery geht?
Eru
47
Ich weiß, dass es ein alter Kommentar ist, aber ich frage mich Ihre Frage @ MFD3000, weil das Dokument sagt: Gibt true zurück, wenn das Objekt leer ist (wie der Name schon sagt)
Александр Фишер
21
jQuery für eine solche grundlegende Aufgabe einzubeziehen, ist nicht das, was ich als die richtige Antwort bezeichnen würde. Es ist wahr, dass jQuery heutzutage fast allgegenwärtig ist, aber wir sollten trotzdem nicht vergessen, dass es sich um eine sehr fähige Sprache handelt.
Pablo Mescher
54
Typischer JS-Snobismus in diesen Kommentaren. Jeder weiß, dass ein großer Teil von JavaScript im Web auf jQuery geschrieben ist. Daher ist es durchaus akzeptabel, hier eine Lösung für jQuery bereitzustellen, wenn bereits eine Methode zum Testen von Objekten integriert ist. Es ist wahrscheinlich, dass Tausende von Entwicklern, die Hilfe suchen, diese Antwort hilfreich finden. Niemand sagte, es sei der einzige Weg, dies zu tun. Ich bemerke, wie sich niemand elitär gegenüber dem Typen underscore.js
verhält
276

Dies ist meine bevorzugte Lösung:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Dhruvio
quelle
1
Kompatibilitätsproblem mit IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
doublejosh
3
@ Jero Franzani: Nein, tut es nicht
Nikoskip
Die Länge von Object.keys ({}). Ist zehnmal langsamer als die Option (für ... in ...). Ich empfehle, sie zu vermeiden, um zu testen, ob ein Objekt leer ist.
Davidhadas
10
Object.keys(new Date()).length === 0;; Diese Antwort kann also irreführend sein.
CJBarth
new Date()ist kein Objekt. nd = new Date(); nd.constructor === Object;führt zu false.
Pors
204

Sie können Underscore.js verwenden .

_.isEmpty({}); // true
Baggz
quelle
19
Oder Sie könnten lodash verwenden, ist leer ( lodash.com/docs#isEmpty ), aber wie unterscheidet sich das von der Verwendung einer jQuery-Lösung ? Sie müssen noch eine zusätzliche Bibliothek installieren. Ich denke, eine Vanille-Javascript-Lösung ist die Absicht.
tfmontague
10
Es ist anders, wenn Sie JS im Backend mit Node.js verwenden möchten. Nur wenige Benutzer möchten jQuery (eine Front-End-Bibliothek, die hauptsächlich für DOM-Manipulationen verwendet wird) im Backend verwenden.
Nahn
3
@tfmontague-Unterstrich ist in Knoten-Apps sehr verbreitet, fast so allgegenwärtig wie jQ auf der Clientseite. Ich hatte bereits Unterstrich erforderlich, wusste aber nicht, dass es diese Funktion hatte
rw-nandemo
5
Der Unterstrich wird durch lodash ersetzt. Verwenden Sie das stattdessen.
Demisx
2
Seien Sie vorsichtig mit Datumstypen, isEmpty gibt immer true für Date zurück, siehe github.com/jashkenas/underscore/issues/445
mentat
116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

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

es köln
quelle
5
Dies schließt nicht aufzählbare Eigenschaften ein, falls Sie sich interessieren.
Die Länge von Object.getOwnPropertyNames ({}). Ist zehnmal langsamer als die Option (für ... in ...). Ich empfehle, sie zu vermeiden, um zu testen, ob ein Objekt leer ist.
Davidhadas
4
Object.getOwnPropertyNames(new Date()).length === 0;; Diese Antwort kann also irreführend sein.
CJBarth
80

Wie wäre es mit JSON.stringify? Es ist fast in allen modernen Browsern verfügbar.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
Ateszki
quelle
23
return (JSON.stringify (obj) == '{}')
Vic
26
Dies ist langsam und Geschwindigkeit ist für diese Art von Dienstprogramm wichtig. Schneller Perf-Test hier: jsperf.com/empty-object-test
1
Dies ist eine sehr langsame Option - ich schlage vor, stattdessen die Option (für ... in) zu verwenden
davidhadas
2
Und es funktioniert nicht für Objekte, die Funktionen enthalten.
Felix Kling
1
Es wird auch ein Fehler ausgegeben, wenn das Objekt einen Zirkelverweis enthält. Es ist also langsam, unzuverlässig und kann Fehler verursachen und alles andere kaputt machen. Kein Grund, es jemals zu benutzen.
Burak
62

Ich bin gerade in eine ähnliche Situation geraten. Ich wollte JQuery nicht verwenden und wollte dies mit reinem Javascript tun.

Und was ich tat, war, die folgende Bedingung zu verwenden, und es funktionierte für mich.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

Verwenden Sie für nicht gleich: JSON.stringify(obj) !== '{}'

Schauen Sie sich diese JSFiddle an

Anish Nair
quelle
4
Schlägt für Objekte mit Zirkelverweisen fehl, da JSON.stringify speziell eine Ausnahme für sie auslöst.
Pedro Montoto García
1
@ PedroMontotoGarcía Ok und wie hat ein leeres Objekt einen Zirkelverweis?
KthProg
8
Wenn das Objekt nicht leer ist (und es auch für sie funktionieren sollte).
Pedro Montoto García
Dies scheint bereits von @Ateszki erwähnt worden zu sein und ist eine der langsamsten Methoden, um zu überprüfen, ob ein Objekt nicht leer ist.
Cwadding
Oh ja .. ich habe es verpasst. Ich geriet in eine Situation, in der ich dieses Javascript erreichen wollte, und nach einigem Nachdenken fand ich es auf diese Weise heraus. @Ateszki, auch wenn ich so bin wie du. :-) Übrigens gab es viele Antworten darauf, und so habe ich deine Antwort verpasst.
Anish Nair
60

Alte Frage, hatte aber gerade das Problem. Das Einschließen von JQuery ist keine gute Idee, wenn Sie nur überprüfen möchten, ob das Objekt nicht leer ist. Wenn Sie stattdessen tief in den Code von JQuery eintauchen , erhalten Sie die Antwort:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
Jonathan Petitcolas
quelle
5
Dies ist nur nützlich, wenn ein anderer Prozess Ihrem Basisobjekt keinen Prototyp hinzugefügt hat. Um dies wirklich praktikabel zu machen, müssen Sie auf obj.hasOwnProperty (name)
mpemburn
1
Dies fügt Christophs Antwort von 2009 nichts hinzu .
Dan Dascalescu
39

Es gibt eine einfache Möglichkeit, wenn Sie einen neueren Browser verwenden. Object.keys(obj).length == 0

herunterladen
quelle
1
Woher kommt die keysImmobilie?
2
Es ist eine Standardmethode in ECMAScript 5.1
Download
1
Wie kann der obige Kommentar 4 positive Stimmen haben? Ja, Object.keysist eine Standardmethode, aber Objekte haben keine Schlüsseleigenschaft. Dieser Code meldet also jedes Objekt als leer, es sei denn, es hat versehentlich eine Eigenschaft keymit einem Wert, der wiederum eine Eigenschaft mit dem Namen lengthungleich Null ist. Schrecklich!
Scravy
Object.keys(new Date()).length === 0;; Diese Antwort kann also irreführend sein.
CJBarth
11
@ scravy Object ist die Klasse Object. Object verfügt über eine statische Methode namens 'keys', die ein Objekt als Argument akzeptiert. Diese Methode gibt ein Array von Zeichenfolgen zurück, wobei die Zeichenfolgen Eigenschaftsnamen sind. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sgnl
34

Performance

Heute 2020.01.17 führe ich Tests auf MacOs HighSierra 10.13.6 unter Chrome v79.0, Safari v13.0.4 und Firefox v72.0 für ausgewählte Lösungen durch.

Schlussfolgerungen

  • Lösungen basierend auf for-in(A, J, L, M) sind am schnellsten
  • Lösungen basierend auf JSON.stringify(B, K) sind langsam
  • überraschenderweise ist auch die auf Object(N) basierende Lösung langsam

Geben Sie hier die Bildbeschreibung ein

Einzelheiten

Unten im Snippet werden 15 Lösungen vorgestellt. Wenn Sie einen Leistungstest auf Ihrem Computer ausführen möchten, klicken Sie HIER .

Geben Sie hier die Bildbeschreibung ein

Kamil Kiełczewski
quelle
Vieles davon macht keinen Sinn, weil Sie alles auf eine Rückkehr von falsch und / oder wahr stützen. Manchmal benötigt die Programmierung eine if-Anweisung oder einen ternären Operator. nur zu Ihrer Information
Christian Matthew
1
Es ist die beste Antwort, danke, die erste Lösung funktioniert wie ein Zauber
Carlos Jesus Arancibia Taborga
33

Die Verwendung von Object.keys (obj) .length (wie oben für ECMA 5+ vorgeschlagen) ist für leere Objekte zehnmal langsamer! Halten Sie sich an die Option der alten Schule (für ... in).

Getestet unter Node, Chrome, Firefox und IE 9 wird deutlich, dass für die meisten Anwendungsfälle:

  • (für ... in ...) ist die schnellste Option!
  • Object.keys (obj) .length ist für leere Objekte zehnmal langsamer
  • JSON.stringify (obj) .length ist immer die langsamste (nicht überraschend)
  • Object.getOwnPropertyNames (obj) .length dauert länger als Object.keys (obj) .length kann auf einigen Systemen viel länger sein.

Fazit: Verwenden Sie:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

oder

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

Detaillierte Testergebnisse und Testcode finden Sie unter Ist das Objekt leer?

Davidhadas
quelle
Object.keysist langsam, aber weniger Code. Auf einer kleinen Seite, auf der dies aufgerufen wird ... vielleicht 10 Mal ... Wird dies angesichts der zusätzlichen Analysezeit des zusätzlichen Codes noch langsamer sein?
Yankee
32

Sie können die Anzahl der Objektschlüssel überprüfen:

if (Object.keys(a).length > 0) {
    // not empty
}
Ashutosh Ranjan
quelle
8
Warum würden Sie einen Kommentar für eine bereits gegebene Antwort hinzufügen und eine schlechtere Antwort geben? stackoverflow.com/a/32108184/4229159 und es ist die erste Antwort vom April
Alejandro Vales
Wie wäre es, wenn ich ein sehr großes Objekt habe und dies in jeder Schleife mache, um zu sehen, ob das Objekt leer war?
StefansArya
27
  1. Nur eine Problemumgehung. Kann Ihr Server eine spezielle Eigenschaft generieren, wenn keine Daten vorliegen?

    Zum Beispiel:

    var a = {empty:true};

    Dann können Sie es einfach in Ihrem AJAX-Rückrufcode überprüfen.

  2. Eine andere Möglichkeit, dies zu überprüfen:

    if (a.toSource() === "({})")  // then 'a' is empty

BEARBEITEN : Wenn Sie eine JSON-Bibliothek (z. B. JSON.js) verwenden, können Sie die Funktion JSON.encode () ausprobieren und das Ergebnis anhand einer leeren Wertzeichenfolge testen.

Thevs
quelle
6
toSource()ist nicht Standard und funktioniert nicht in IE oder Opera (und möglicherweise anderen Browsern, die ich nicht überprüft habe)
Christoph
4
@Thevs: Vielleicht haben Sie eine andere Kopie der aktuellen Version von ECMA-262, aber meine listet keine toSourceEigenschaft in Abschnitt 15.2.4 auf; Laut MDC wurde es in JS1.3 (dh Netscape Navigator 4.06) eingeführt, aber NICHT in ECMA-262, 3. Ausgabe!
Christoph
4
@Thevs: Nun, mindestens 2 wichtige Browser-Anbieter haben es nicht implementiert, daher ist es kaum ein De-facto-Standard, und da es nicht in ECMA-262 enthalten ist, ist es auch kein echter ...
Christoph
4
Selbst wenn es funktioniert, toSource()ist dies ein schrecklicher Weg (wie es ist JSON.encode()). Es muss eine Zeichenfolge erstellt werden, die Ihr gesamtes Objekt darstellt, um zu überprüfen, ob es leer ist. Das Konvertieren von Dingen in Zeichenfolgen ist mit einem Mehraufwand verbunden. Darüber hinaus müssen jedoch eine Million Dinge konvertiert werden, wenn Ihr Objekt über eine Million Eigenschaften verfügt. Wenn Sie jedoch nur eine betrachten, werden Sie darauf hingewiesen, dass es nicht leer ist.
Jasper
4
@Thevs der Aufwand größer ist, auch wenn es sein könnte (ich bin sicher , dass es nicht unter allen Umständen ist) in der gleichen Größenordnung. Diese Antwort beinhaltet jedoch die Rückgabe von false, sobald eine andere Eigenschaft gefunden wird, wodurch die Geschichte insgesamt anders ist ...
Jasper
25

Ich habe eine vollständige Funktion erstellt, um festzustellen, ob das Objekt leer ist.

Es verwendet Object.keysvon ECMAScript 5 (ES5) Funktionalität , wenn möglich , die beste Leistung (siehe erreichen Kompatibilitätstabelle ) und Fallbacks auf den meisten kompatiblen Ansatz für ältere Motoren (Browser).

Lösung

/**
 * 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;
    }
}

Hier ist das Wesentliche für diesen Code.

Und hier ist die JSFiddle mit Demonstration und einem einfachen Test.

Ich hoffe es wird jemandem helfen. Prost!

Slava Fomin II
quelle
3
Dies schlägt für ein nullObjekt fehl .
Hallo @torazaburo! Vielen Dank für Ihre Nachricht! Ich habe alle Quellen mit korrekter Implementierung aktualisiert.
Slava Fomin II
1
Die Länge von Object.keys ({}). Ist zehnmal langsamer als die Option (für ... in ...). Ich empfehle, sie zu vermeiden, um zu testen, ob ein Objekt leer ist.
Davidhadas
1
Object.keys(new Date()).length === 0;; Diese Antwort kann also irreführend sein.
CJBarth
19

Ich benutze das.

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;
}

Z.B:

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;

von hier

Aktualisieren

ODER

Sie können die jQuery-Implementierung von isEmptyObject verwenden

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}
kiranvj
quelle
Hallo. Wenn Sie diese Funktion mit number oder boolean true oder false testen, geben Sie true zurück, und dies ist kein korrektes Ergebnis. isObjectEmpty (true). isObjectEmpty (false). isObjectEmpty (1)
iman
2
Wir prüfen, ob das Objekt leer ist, nicht, ob der Datentyp ein Objekt ist. In Ihrem Fall, um zu überprüfen, ob es ein Objekt ist, müssen wir etwas wie if (Typ eines === "Objekts") {...}
kiranvj
15

Das folgende Beispiel zeigt, wie Sie testen, ob ein JavaScript-Objekt leer ist. Wenn mit leer gemeint ist, bedeutet dies, dass es keine eigenen Eigenschaften hat.

Das Skript funktioniert unter 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
quelle
15

Gemäß der ES2017- Spezifikation für Object.entries () ist die Überprüfung mit jedem modernen Browser einfach.

Object.entries({}).length === 0
Vikrant
quelle
3
Gibt es einen Vorteil, wenn Sie dies über Object.keysoder verwenden Object.values?
Faintsignal
@faintsignal mit diesen sind vollkommen in Ordnung. Ich habe gerade Einträge hinzugefügt, die ich in den Kommentaren nicht gefunden habe.
Vikrant
13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
Leichtigkeitsrennen im Orbit
quelle
4
Dies gilt auch dann, wenn beispielsweise eine JavaScript-Bibliothek Objectmit einer Methode durch die Prototypenkette erweitert wird, da diese aufzählbar ist und die for inAnweisung die aufzählbaren Eigenschaften durchläuft.
viam0Zah
12

jQuery hat isEmptyObject()für diesen Fall eine spezielle Funktion :

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Lesen Sie mehr unter http://api.jquery.com/jQuery.isEmptyObject/


quelle
12

Ich würde prüfen, ob es mindestens einen Schlüssel hat. Das würde ausreichen, um mir zu sagen, dass es nicht leer ist.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
Tudor Morar
quelle
1
Was ist, wenn der erste Schlüssel einen falseWert zurückgibt ? Das Ergebnis falseist falsch.
Jimmy Obonyo Abor
Ich habe das getestet. Können Sie ein funktionierendes Beispiel geben?
Tudor Morar
1
Dies ist kurz und prägnant, führt jedoch zu einem Laufzeitfehler, wenn das Objekt nicht definiert ist
Mrinmoy
11

Unter der Haube verwenden alle leeren Prüfmethoden in allen Bibliotheken die Logik der Objektschlüsselprüfung. Es ist eine seltsame Art, es verständlich zu machen, die Sie in eine hier beschriebene Methode einfügen können .

for(key in obj){
   //your work here.
 break;
}

Was sich in ES5 entwickelt hat , können Sie jetzt einfach gesagt die Schlüssellänge des Objekts überprüfen, indem Sie eine Object.KeysMethode verwenden, die Ihr Objekt als Parameter verwendet:

if(Object.keys(obj).length > 0){
 //do your work here
}

Oder wenn Sie Lodash verwenden (müssen Sie sein) dann.

 _.isEmpty(obj) //==true or false
ahmadalibaloch
quelle
Dies ist zwar eine seltsame Methode, um eine if-Anweisung abzugeben, aber es wird wahrscheinlich jemanden verwirren, der den Code nach Ihnen verwaltet.
Soren
10


Sie können diesen einfachen Code verwenden, der weder jQuery noch andere Bibliotheken verwendet hat

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

Die JSON- Klasse und ihre Funktionen ( Parse und Stringify ) sind sehr nützlich, haben jedoch einige Probleme mit IE7 , die Sie mit diesem einfachen Code beheben können: http://www.json.org/js.html .

Anderer einfacher Weg (einfachster Weg):
Sie können diesen Weg ohne Verwendung von jQuery oder JSON- Objekt verwenden.

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
quelle
JSON.stringifyDie Lösung schlägt fehl, wenn das Objekt nicht stringifizierbare Eigenschaften wie Funktionen oder "undefiniert" enthält, obwohl dies ein Randfall ist.
10

Der beste Weg, den ich gefunden habe:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

Funktioniert für:

    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
quelle
3
Ich würde sagen, dass 0 nicht leer ist, da es sich tatsächlich um eine Zahl handelt. Alles andere sieht gut aus, aber die Lösung ist einfach. Fügen Sie dies in der ersten if-Anweisung hinzu. if (!obj && obj !== 0).
mjwrazor
9

Meine Einstellung:

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

Ich glaube nicht, dass Object.keys()derzeit alle Browser implementiert sind .

NiKo
quelle
2
Object.keys(new Date()).length === 0;; Diese Antwort kann also irreführend sein.
CJBarth
3
Hängt davon ab, ob ein Datum immer "voll" ist, obwohl keine Schlüssel verfügbar gemacht werden. Aber ich bin damit einverstanden, dass, wenn dies Ihr Plan ist, das Hinzufügen einer zusätzlichen Prüfinstanz für den Datumskonstruktor eine gute Option ist.
NiKo
9

Wenn jQuery und der Webbrowser nicht verfügbar sind, gibt es in underscore.js auch eine isEmpty-Funktion.

_.isEmpty({}) // returns true

Außerdem wird nicht angenommen, dass der Eingabeparameter ein Objekt ist. Für eine Liste oder Zeichenfolge oder undefiniert wird auch die richtige Antwort angezeigt.

jichi
quelle
Unterstrich wurde bereits einige Jahre zuvor in einer Antwort erwähnt .
Dan Dascalescu
7

Vorbehalt! Achten Sie auf die Einschränkungen von 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 ) );

Anzeigen

    In acht nehmen!! obj ist NICHT leer!

    obj = {f: function () {}}

    JSON.stringify (obj)

    kehrt zurück

    {}
Ekim
quelle
7

Die richtige Antwort ist:

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

Dies überprüft, dass:

  • Das Objekt hat keine eigenen Eigenschaften (unabhängig von der Aufzählbarkeit).
  • Das Objekt hat keine eigenen Eigenschaftssymbole.
  • Der Prototyp des Objekts ist genau Object.prototype.

Mit anderen Worten, das Objekt ist nicht von dem Objekt zu unterscheiden, das mit erstellt wurde {}.

Jesse
quelle
6

Zusätzlich zu Thevs Antwort:

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

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

es ist jquery + jquery.json

Starikovs
quelle
Ich mag JSON nicht, weil es nicht mit kreisförmigen Objektstrukturen funktioniert.
funktioniert nicht
2
Wenn Ihre Seite jQuery lädt $.isEmptyObject(), verschwenden Sie keine Zyklen mit nicht offensichtlichen Conversions.
Skifahrerseite
6

Sugar.JS bietet zu diesem Zweck erweiterte Objekte an. Der Code ist sauber und einfach:

Erstellen Sie ein erweitertes Objekt:

a = Object.extended({})

Überprüfen Sie die Größe:

a.size()
Mikemaccana
quelle