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;
}
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;
}
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
@Vlad Das ist wahrscheinlich nicht sehr effizient. Warum die JS-Engine auffordern, die todos die Schlüssel, nur um herauszufinden, ob es tout Tasten
@VictorGrazi besteht die Möglichkeit, dass die Engine all diese Schlüssel bereits im Speicher ablegt, um sie leicht zu finden?
@Š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.
Überrascht zu sehen, so viele schwache Antworten auf eine solche grundlegende JS Frage ... Die oberste Antwort ist aus diesen Gründen auch nicht gut:
true
en undefined
for...in
was an sich schon extrem langsam istfor...in
ist nutzlos - Rückkehr false
なくしては hasOwnProperty
Magie wird gut funktionierenEs gibt nämlich eine einfachere Lösung:
function isEmpty(value) {
return Boolean(value && typeof value === 'object') && !Object.keys(value).length;
}
Dies ist bei leeren Objekten 10 Mal langsamer als die Verwendung der Option (for... in) - siehe Leistungstests oben.
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.
https://lodash.com/docs#isEmpty ist ziemlich praktisch:
_.isEmpty({}) // true
_.isEmpty() // true
_.isEmpty(null) // true
_.isEmpty("") // true
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.
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.