json check if - Wie teste ich auf ein leeres JavaScript-Objekt?





15 Answers

Es gibt keinen einfachen Weg, 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 die Unterstützung für ECMAScript 5 verfügbar ist, können Object.keys() stattdessen Object.keys() verwenden:

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

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

var a = {};

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




Dies ist meine bevorzugte Lösung:

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






Alte Frage, hatte aber gerade das Problem. Das Einschließen von JQuery ist nicht wirklich eine gute Idee, wenn Sie nur prüfen möchten, ob das Objekt nicht leer ist. Stattdessen nur tief in den Code von JQuery , und Sie erhalten die Antwort:

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



Es gibt einen einfachen Weg, wenn Sie sich in einem neueren Browser befinden. Object.keys(obj).length == 0




  1. Nur ein Workaround. Kann Ihr Server eine spezielle Eigenschaft generieren, wenn keine Daten vorhanden sind?

    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.




Die Verwendung von Object.keys (obj) .length (wie oben für ECMA 5+ empfohlen) ist für leere Objekte 10 Mal langsamer! Bleib bei der alten Schule (für ... in).

Getestet unter Node, Chrom, 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). Die Länge kann auf manchen Systemen viel länger sein.

Unterm Strich Leistung weise verwenden:

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 Objekt leer?




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



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

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

Weitere jQuery Sie unter jQuery




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



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

_.isEmpty({}) // returns true

Darüber hinaus nimmt es nicht an, dass der Eingabeparameter ein Objekt ist. Bei einer Liste oder Zeichenfolge oder undefiniert wird auch die richtige Antwort angezeigt.




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.

Boolean(Object.keys(obj)[0])



Neben Thevs Antwort:

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

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

es ist jquery + jquery.json




Sugar.JS stellt für diesen Zweck erweiterte Objekte zur Verfügung. Der Code ist sauber und einfach:

Machen Sie ein erweitertes Objekt:

a = Object.extended({})

Überprüfen Sie die Größe:

a.size()



Die richtige Antwort ist:

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

Dies prü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 ist das Objekt nicht von einem mit {} erstellten Objekt zu unterscheiden.




Related