3893 Stimmen

Wie kann ich auf ein leeres JavaScript-Objekt testen?

Nach einer AJAX-Anfrage kann es vorkommen, dass meine Anwendung ein leeres Objekt zurückgibt, z. B.:

var a = {};

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

5voto

cwadding Punkte 840

Eine andere Alternative ist die Verwendung von is.js (14kB) im Gegensatz zu jquery (32kB), lodash (50kB), oder Unterstrich (16,4kB). is.js erwies sich als die schnellste Bibliothek unter den oben genannten Bibliotheken, die zur Feststellung, ob ein Objekt leer ist, verwendet werden kann.

http://jsperf.com/check-empty-object-using-libraries

Offensichtlich sind nicht alle diese Bibliotheken genau das gleiche, so dass, wenn Sie brauchen, um leicht zu manipulieren das DOM dann jquery könnte immer noch eine gute Wahl sein, oder wenn Sie mehr als nur eine Typenprüfung benötigen, dann lodash o Unterstrich könnte gut sein. Was die is.js Hier ist die Syntax:

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

Wie Unterstriche und Lodashs _.isObject() ist dies nicht ausschließlich für objects sondern gilt auch für arrays y strings .

Unter der Haube verwendet diese Bibliothek Object.getOwnPropertyNames was ähnlich ist wie Object.keys sondern Object.getOwnPropertyNames ist eine gründlichere Methode, da sie aufzählbare und nicht aufzählbare Eigenschaften wie beschrieben zurückgibt ici .

is.empty = function(value) {
    if(is.object(value)){
        var num = Object.getOwnPropertyNames(value).length;
        if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
            return true;
        }
        return false;
    } else {
        return value === '';
    }
};

Wenn Sie keine Bibliothek einbinden wollen (was verständlich ist) und wissen, dass Sie nur Objekte überprüfen (keine Arrays oder Strings), dann sollte die folgende Funktion Ihren Bedürfnissen entsprechen.

function isEmptyObject( obj ) {
    return Object.getOwnPropertyNames(obj).length === 0;
}

Das ist nur ein bisschen schneller als is.js, weil man nicht prüft, ob es ein Objekt ist.

5voto

Bekim Bacaj Punkte 5223

IsEmpty Objekt, das unerwartet seine Bedeutung verloren hat, d.h.: es ist Programmierung Semantik als unser berühmter Guru von Yahoo die benutzerdefinierten nicht aufzählbaren Objekteigenschaften bei der ECMA vorstellte und sie akzeptiert wurden.

[ Wenn Sie die Geschichte nicht mögen, können Sie direkt zum Arbeitscode übergehen ]

Ich sehe viele gute Antworten \ Lösungen für diese Frage \ Problem. Es ist jedoch nicht der richtige Weg, die neuesten Erweiterungen von ECMA Script zu übernehmen. Wir haben früher das Web zurückgehalten, um Netscape 4.x und Netscape-basierte Seiten und Projekte am Leben zu erhalten, die (nebenbei bemerkt) extrem primitiv, rückständig und idiosynkratisch waren und sich weigerten, neue W3C-Standards und Vorschläge zu verwenden [ die für die damalige Zeit ziemlich revolutionär und programmiererfreundlich waren ], während wir jetzt brutal gegen unser eigenes Erbe vorgehen.

Die Abschaffung von Internet Explorer 11 ist schlichtweg falsch! Ja, einige alte Krieger, die Microsoft infiltriert haben und seit der Ära des "Kalten Krieges" schlummern, haben dem zugestimmt - aus den falschen Gründen. - Aber das macht es noch lange nicht richtig!

Nutzung einer neu eingeführten Methode \property in Ihre Antworten ein und überreichen Sie sie als Entdeckung ("das war schon immer da, aber wir haben es nicht bemerkt"), sondern eine neue Erfindung (für das, was es wirklich ist), ist etwas "grün" und schädlich. Solche Fehler habe ich vor 20 Jahren gemacht, als ich noch nicht wusste, was da drin ist, und alles, wofür ich eine Referenz finden konnte, als gängige Arbeitslösung behandelte...

Abwärtskompatibilität ist wichtig!

Wir wissen es nur noch nicht. Deshalb ist es mir ein Bedürfnis, meine "jahrhundertealte" generische Lösung mitzuteilen, die auch in der unvorhergesehenen Zukunft rückwärts- und vorwärtskompatibel bleibt.

Es gab zahlreiche Angriffe auf die in Betreiber aber ich denke, dass die Leute, die das tun, endlich zur Vernunft gekommen sind und wirklich angefangen haben, eine echte Dynamic Type Language wie JavaScript und ihre schöne Natur zu verstehen und zu schätzen.

Meine Methoden zielen darauf ab, einfach und nuklear zu sein, und aus den oben genannten Gründen nenne ich sie nicht "leer", weil die Bedeutung dieses Wortes nicht mehr zutreffend ist. Enumerable" scheint das Wort mit der genauen Bedeutung zu sein.

function isEnum( x ) { for( var p in x )return!0; return!1 };

Einige Anwendungsfälle:

isEnum({1:0})
true

isEnum({})
false

isEnum(null)
false

Vielen Dank fürs Lesen!

1 Stimmen

Es ist ekelhaft, was die Leute mit dem Internet angestellt haben.

4voto

ganesh phirke Punkte 435

Wir können mit vanilla js mit Handhabung null oder undefiniert überprüfen auch wie folgt,

function isEmptyObject(obj) {
  return !!obj && Object.keys(obj).length === 0 && obj.constructor === Object;
}

//tests

isEmptyObject(new Boolean());  // false 
isEmptyObject(new Array());    // false 
isEmptyObject(new RegExp());   // false 
isEmptyObject(new String());   // false 
isEmptyObject(new Number());   // false 
isEmptyObject(new Function()); // false 
isEmptyObject(new Date());     // false
isEmptyObject(null);          // false
isEmptyObject(undefined);     // false
isEmptyObject({});            // true

4voto

NiRUS Punkte 3378

Dieser einzeilige Code hilft auch beim Fallback zu älteren Browsern.

var a = {}; //if empty returns false
(Object.getOwnPropertyNames ? Object.getOwnPropertyNames(a).length !== 0 : (function(){ for(var key in a) break; return !!key })()) //Returns False

var a = {b:2}; //if not empty returns true
(Object.getOwnPropertyNames ? Object.getOwnPropertyNames(a).length !== 0 : (function(){ for(var key in a) break; return !!key })()) //Returns true

Object.getOwnPropertyNames ist in ECMA-5 implementiert. Die obige Zeile funktioniert in älteren Browsern mit einer Fallback-Funktion.


Eine weitere schnelle Lösung ist die Überprüfung der length Eigenschaft von Object.keys , Object.entries o Object.values

Wissensartikel: In diesem SO-Beitrag finden Sie die genauen Unterschiede zwischen Object.keys Vs Object.getOwnPropertyNames

4voto

mikemaccana Punkte 93077

Zucker.JS stellt zu diesem Zweck erweiterte Objekte zur Verfügung. Der Code ist sauber und einfach:

Erstellen Sie ein erweitertes Objekt:

a = Object.extended({})

Überprüfen Sie die Größe:

a.size()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X