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?
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?
if( Object.entries(a).length > 0){ //do }
Antworten:
ECMA 5+ :
Beachten Sie jedoch, dass dadurch ein unnötiges Array erstellt wird (der Rückgabewert von
keys
).Pre-ECMA 5:
jQuery :
lodash :
Unterstreichen :
Hoek
ExtJS
AngularJS (Version 1)
Ramda
quelle
Object.keys(new Date()).length === 0
;; Diese Antwort kann also irreführend sein.(new Date()).constructor === Date
oder umgekehrt({}).constructor === Object
.Object.keys()
prüft keine nicht aufzählbaren Eigenschaften oder Symbole. Sie müssenObject.getOwnPropertyNames()
undObject.getOwnPropertySymbols()
stattdessen verwenden. DiesObject.getPrototypeOf()
ist auch der richtige Weg, um den Prototyp eines Objekts zu erhalten.obj.constructor
kann leicht geschmiedet werden. Beispiel :function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.Es gibt keine einfache Möglichkeit, dies zu tun. Sie müssen die Eigenschaften explizit durchlaufen:
Wenn ECMAScript 5-Unterstützung verfügbar ist, können Sie
Object.keys()
stattdessen Folgendes verwenden :quelle
isEmpty()
, sollte also zurückkehren,false
wenn sie eine Eigenschaft hatFür diejenigen unter Ihnen, die das gleiche Problem haben, aber jQuery verwenden, können Sie jQuery.isEmptyObject verwenden .
quelle
underscore.js
Dies ist meine bevorzugte Lösung:
quelle
Object.keys(new Date()).length === 0
;; Diese Antwort kann also irreführend sein.new Date()
ist kein Objekt.nd = new Date(); nd.constructor === Object;
führt zufalse
.Sie können Underscore.js verwenden .
quelle
siehe http://bencollier.net/2011/04/javascript-is-an-object-empty/
quelle
Object.getOwnPropertyNames(new Date()).length === 0
;; Diese Antwort kann also irreführend sein.Wie wäre es mit JSON.stringify? Es ist fast in allen modernen Browsern verfügbar.
quelle
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.
Verwenden Sie für nicht gleich:
JSON.stringify(obj) !== '{}'
Schauen Sie sich diese JSFiddle an
quelle
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:
quelle
Es gibt eine einfache Möglichkeit, wenn Sie einen neueren Browser verwenden.
Object.keys(obj).length == 0
quelle
keys
Immobilie?Object.keys
ist eine Standardmethode, aber Objekte haben keine Schlüsseleigenschaft. Dieser Code meldet also jedes Objekt als leer, es sei denn, es hat versehentlich eine Eigenschaftkey
mit einem Wert, der wiederum eine Eigenschaft mit dem Namenlength
ungleich Null ist. Schrecklich!Object.keys(new Date()).length === 0
;; Diese Antwort kann also irreführend sein.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
for-in
(A, J, L, M) sind am schnellstenJSON.stringify
(B, K) sind langsamObject
(N) basierende Lösung langsamEinzelheiten
Unten im Snippet werden 15 Lösungen vorgestellt. Wenn Sie einen Leistungstest auf Ihrem Computer ausführen möchten, klicken Sie HIER .
Code-Snippet anzeigen
quelle
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:
Fazit: Verwenden Sie:
oder
Detaillierte Testergebnisse und Testcode finden Sie unter Ist das Objekt leer?
quelle
Object.keys
ist 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?Sie können die Anzahl der Objektschlüssel überprüfen:
quelle
Nur eine Problemumgehung. Kann Ihr Server eine spezielle Eigenschaft generieren, wenn keine Daten vorliegen?
Zum Beispiel:
Dann können Sie es einfach in Ihrem AJAX-Rückrufcode überprüfen.
Eine andere Möglichkeit, dies zu überprüfen:
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.
quelle
toSource()
ist nicht Standard und funktioniert nicht in IE oder Opera (und möglicherweise anderen Browsern, die ich nicht überprüft habe)toSource
Eigenschaft 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!toSource()
ist dies ein schrecklicher Weg (wie es istJSON.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.Ich habe eine vollständige Funktion erstellt, um festzustellen, ob das Objekt leer ist.
Es verwendet
Object.keys
von 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
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!
quelle
null
Objekt fehl .Object.keys(new Date()).length === 0
;; Diese Antwort kann also irreführend sein.Ich benutze das.
Z.B:
von hier
Aktualisieren
ODER
Sie können die jQuery-Implementierung von isEmptyObject verwenden
quelle
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.
quelle
quelle
Object.keys
oder verwendenObject.values
?quelle
Object
mit einer Methode durch die Prototypenkette erweitert wird, da diese aufzählbar ist und diefor in
Anweisung die aufzählbaren Eigenschaften durchläuft.jQuery hat
isEmptyObject()
für diesen Fall eine spezielle Funktion :Lesen Sie mehr unter http://api.jquery.com/jQuery.isEmptyObject/
quelle
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.
quelle
false
Wert zurückgibt ? Das Ergebnisfalse
ist falsch.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 .
Was sich in ES5 entwickelt hat , können Sie jetzt einfach gesagt die Schlüssellänge des Objekts überprüfen, indem Sie eine
Object.Keys
Methode verwenden, die Ihr Objekt als Parameter verwendet:Oder wenn Sie Lodash verwenden (müssen Sie sein) dann.
quelle
Sie können diesen einfachen Code verwenden, der weder jQuery noch andere Bibliotheken verwendet hat
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.
quelle
JSON.stringify
Die Lösung schlägt fehl, wenn das Objekt nicht stringifizierbare Eigenschaften wie Funktionen oder "undefiniert" enthält, obwohl dies ein Randfall ist.Der beste Weg, den ich gefunden habe:
Funktioniert für:
quelle
if (!obj && obj !== 0)
.Meine Einstellung:
Ich glaube nicht, dass
Object.keys()
derzeit alle Browser implementiert sind .quelle
Object.keys(new Date()).length === 0
;; Diese Antwort kann also irreführend sein.Wenn jQuery und der Webbrowser nicht verfügbar sind, gibt es in underscore.js auch eine isEmpty-Funktion.
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.
quelle
Vorbehalt! Achten Sie auf die Einschränkungen von JSON.
Anzeigen
quelle
Die richtige Antwort ist:
Dies überprüft, dass:
Object.prototype
.Mit anderen Worten, das Objekt ist nicht von dem Objekt zu unterscheiden, das mit erstellt wurde
{}
.quelle
Zusätzlich zu Thevs Antwort:
es ist jquery + jquery.json
quelle
$.isEmptyObject()
, verschwenden Sie keine Zyklen mit nicht offensichtlichen Conversions.Sugar.JS bietet zu diesem Zweck erweiterte Objekte an. Der Code ist sauber und einfach:
Erstellen Sie ein erweitertes Objekt:
Überprüfen Sie die Größe:
quelle