528 Stimmen

Ist das Objekt leer?

Wie kann man am schnellsten prüfen, ob ein Objekt leer ist oder nicht?

Gibt es einen schnelleren und besseren Weg als diesen?

function count_obj(obj){
    var i = 0;
    for(var key in obj){
        ++i;
    }

    return i;
}

6 Stimmen

Möchten Sie die Eigenschaften zählen (das ist es, was der Code tut) oder nur testen, ob das Objekt leer ist oder nicht (das ist in Ihrer Frage angegeben)?

2 Stimmen

Nur als Empfehlung von Bibliotheken, die dazu in der Lage sind is.js y lodash

0 Stimmen

Für derartige Dienstprogramme empfiehlt es sich, einige Bibliotheken zu verwenden. Sie könnten lodash verwenden und etwas wie _.isEmpty(_.keys(yourObject)) . Und ich glaube, Sie können jetzt diese beiden Methoden einzeln importieren, und nicht die gesamte Lodash-Bibliothek.

32voto

Alexey Bushnev Punkte 329

Elegante Art - Tasten verwenden

var myEmptyObj = {};
var myFullObj = {"key":"value"};
console.log(Object.keys(myEmptyObj).length); //0
console.log(Object.keys(myFullObj).length); //1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

2 Stimmen

Warum hat sich niemand zu dieser Lösung geäußert? Sieht für mich gut aus.

1 Stimmen

@Vlad Das ist wahrscheinlich nicht sehr effizient. Warum die JS-Engine auffordern, die todos die Schlüssel, nur um herauszufinden, ob es tout Tasten

1 Stimmen

@VictorGrazi besteht die Möglichkeit, dass die Engine all diese Schlüssel bereits im Speicher ablegt, um sie leicht zu finden?

23voto

Šime Vidas Punkte 172810
function isEmpty( o ) {
    for ( var p in o ) { 
        if ( o.hasOwnProperty( p ) ) { return false; }
    }
    return true;
}

1 Stimmen

@CMS Dummer IE :) Wenigstens hat der IE9 dies korrigiert.

0 Stimmen

@ŠimeVidas: In dieser Lösung deklarieren Sie p in Ihrem for... in Schleife mit dem var Stichwort. Wenn Sie dies nicht tun, wird p ein implizites Global werden? Ich wollte nur nach etwas fragen, das wie eine bewährte Praxis aussieht.

1 Stimmen

@parisminton In der "Standardsprache" funktioniert es. Im Strict-Modus (der empfohlenen Sprache) wird jedoch ein Referenzfehler ausgelöst (es sei denn, es existiert bereits eine Variable mit diesem Namen in einem äußeren Bereich). Daher sollten Sie eine var dort.

22voto

Toolkit Punkte 10023
var x= {}
var y= {x:'hi'}
console.log(Object.keys(x).length===0)
console.log(Object.keys(y).length===0)

true
false

http://jsfiddle.net/j7ona6hz/1/

1 Stimmen

Wenn das schon funktioniert, warum dann nicht gleich dreifach?

1 Stimmen

@JaeGeeTee Nötigung vielleicht?

19voto

mike.shestakov Punkte 413

Überrascht zu sehen, so viele schwache Antworten auf eine solche grundlegende JS Frage ... Die oberste Antwort ist aus diesen Gründen auch nicht gut:

  1. erzeugt es eine globale Variable
  2. renvoie à true en undefined
  3. verwendet for...in was an sich schon extrem langsam ist
  4. innere Funktion for...in ist nutzlos - Rückkehr false なくしては hasOwnProperty Magie wird gut funktionieren

Es gibt nämlich eine einfachere Lösung:

function isEmpty(value) {
    return Boolean(value && typeof value === 'object') && !Object.keys(value).length;
}

7 Stimmen

Ich denke, es ist ok, false auf undefined zurückzugeben, da undefined kein Objekt ist.

1 Stimmen

Dies ist bei leeren Objekten 10 Mal langsamer als die Verwendung der Option (for... in) - siehe Leistungstests oben.

0 Stimmen

Meiner Meinung nach ist diese Frage nicht zu grundlegend: weil "Leere" eine sehr facettenreiche Sache in Javascript ist - je nachdem, mit welcher Art von Wert wir zu tun haben, haben wir unterschiedliche Vorstellungen von "Leere". Ein Array ist leer, wenn es keine Elemente hat. Auch wenn ich sage let a = []; a.v = 'hello'; werden die meisten Menschen zustimmen. a ist "leer". Aber ein Objekt ist leer, wenn es keine Eigenschaften hat. Selbst wenn wir let o = { length: 0 }; werden die meisten Menschen zustimmen (denke ich), dass o ist nicht leer, weil sie eine Eigenschaft "Länge" hat.

11voto

Paweł Rychlik Punkte 667

https://lodash.com/docs#isEmpty ist ziemlich praktisch:

_.isEmpty({})   // true
_.isEmpty()     // true
_.isEmpty(null) // true
_.isEmpty("")   // true

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