Wie kann ich ein leeres JavaScript-Objekt testen?


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 ECMAScript 5-Unterstützung verfügbar ist, können Object.keys() stattdessen Object.keys() verwenden:

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}
Question

Nach einer AJAX-Anfrage kann meine Anwendung manchmal ein leeres Objekt zurückgeben:

var a = {};

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




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 den Eingabeparameter nicht als ein Objekt an. Für eine Liste oder eine Zeichenfolge oder undefiniert wird auch die richtige Antwort angezeigt.




Object.keys (obj) .length (wie oben für ECMA 5+ empfohlen) ist bei leeren Objekten 10 mal langsamer! Bleiben Sie bei der alten Schule (für ... in) Option.

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

  • (für ... in ...) ist die schnellste Option zu verwenden!
  • Object.keys (obj) .length ist 10 mal langsamer für leere Objekte
  • JSON.stringify (obj) .length ist immer die langsamste (nicht überraschend)
  • Object.getOwnPropertyNames (obj) .length dauert länger als Object.keys (obj). Length kann auf manchen Systemen wesentlich länger sein.

Bottom-Line-Leistung, 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;
}

Siehe detaillierte Testergebnisse und Testcode unter Ist Objekt leer?




Ich kann nicht glauben, nach zwei Jahren der Programmierung js es nie geklickt hat, dass leere Objekte und Array sind nicht falsch, die seltsamste Sache ist es hat mich nie erwischt.

Dies gibt true wenn die Eingabe standardmäßig falsch ist oder wenn es sich um ein leeres Objekt oder Array handelt. das trueish ist die trueish Funktion

http://codepen.io/synthet1c/pen/pjmoWL

function falsish( obj ){
    if( (typeof obj === 'number' && obj > 0) || obj === true ){
        return false;
    }
    return !!obj
        ? !Object.keys( obj ).length
        : true;
}

function trueish( obj ){
    return !falsish( obj );
}

falsish({})           //=> true
falsish({foo:'bar'})  //=> false
falsish([])           //=> true
falsish(['foo'])      //=> false
falsish(false)        //=> true
falsish(true)         //=> false
// the rest are on codepen



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

    Beispielsweise:

    var a = {empty:true};
    

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

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

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

EDIT : Wenn Sie eine JSON-Bibliothek (zB JSON.js) verwenden, können Sie die JSON.encode () -Funktion ausprobieren und das Ergebnis gegen eine leere Zeichenfolge testen.




Sie könnten nach der Anzahl der Objektschlüssel suchen:

if (Object.keys(a).length > 0) {
    // not empty
}



Das folgende Beispiel zeigt, wie getestet wird, ob ein JavaScript-Objekt leer ist, wenn mit leer bedeutet, dass es keine eigenen Eigenschaften hat.

Das Skript funktioniert auf ES6.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0 ? true : false;
};
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







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

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



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

Es verwendet developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… aus der ECMAScript 5 (ES5) -Funktionalität, wenn möglich, um die beste Leistung zu erzielen (siehe Kompatibilitätstabelle ) und Fallbacks für den am besten kompatiblen Ansatz für ältere Engines (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 der Gist für diesen Code.

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

Ich hoffe, es wird jemandem helfen. Prost!




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

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

Offensichtlich sind all diese Bibliotheken nicht genau die gleichen, also wenn Sie das DOM leicht manipulieren müssen, dann ist jquery vielleicht immer noch eine gute Wahl oder wenn Sie mehr als nur eine Typüberprüfung benötigen, dann wäre lodash oder underscore gut. Wie für is.js , hier ist die Syntax:

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

Wie das _.isObject() Unterstrich und Lodash gilt dies nicht nur für objects sondern auch für arrays und strings .

Unter der Haube verwendet diese Bibliothek Object.getOwnPropertyNames die Object.getOwnPropertyNames ähnlich ist, aber Object.getOwnPropertyNames ist eine gründlichere, da sie aufzählbare und nicht aufzählbare Eigenschaften Object.keys , wie here beschrieben.

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 Sie wissen, dass Sie nur Objekte (nicht Arrays oder Strings) überprüfen, sollte die folgende Funktion Ihren Bedürfnissen entsprechen.

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

Dies ist nur ein bisschen schneller als is.js, nur weil Sie nicht überprüfen, ob es ein Objekt ist.







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

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

Lesen Sie mehr unter jQuery




Eine andere einfache, reine JS-Art :)

if (JSON.stringify(pathParams) === '{}')




Vorbehalt! Vorsicht vor JSONs Limitationen.

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

zeigt an

    Beware!! obj is NOT empty!

    obj = {  f:function(){}  }

    JSON.stringify( obj )

    returns

    {}



Links