Wie überprüfe ich, ob das Objekt Eigenschaften in JavaScript hat?

167

Vorausgesetzt, ich erkläre

var ad = {}; 

Wie kann ich überprüfen, ob dieses Objekt benutzerdefinierte Eigenschaften enthält?

Ricky
quelle

Antworten:

86

Sie können die Eigenschaften Ihres Objekts wie folgt durchlaufen:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

Es ist wichtig, die zu verwenden hasOwnProperty() Methode zu verwenden, um festzustellen, ob das Objekt die angegebene Eigenschaft als direkte Eigenschaft hat und nicht von der Prototypkette des Objekts geerbt wird.

Bearbeiten

Aus den Kommentaren: Sie können diesen Code in eine Funktion einfügen und ihn als falsch zurückgeben, sobald er den Teil erreicht, in dem sich der Kommentar befindet

Leistungstest

Test Of Object.Keys vs For..In Beim Testen auf Eigenschaften

Daniel Vassallo
quelle
2
Hallo Daniel, eigentlich suche ich ein Gerät, um zu überprüfen, ob ein Objekt benutzerdefinierte Eigenschaften enthält oder nicht. Nicht zu überprüfen, ob eine bestimmte Eigenschaft vorhanden ist.
Ricky
7
@ Ricky: Sie können diesen Code in eine Funktion einfügen und ihn als falsch zurückgeben, sobald er den Teil erreicht, in dem sich der Kommentar befindet.
Daniel Vassallo
8
Ich denke, heutzutage Object.keyswäre die Verwendung am einfachsten: var a = [1,2,3];a.something=4;console.log(Object.keys(a))Da es bereits Teil von ECMA 5 ist, können Sie es sicher shimen: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
HMR
2
Beachten Sie, dass "heutzutage" mit ES5 native Objekte nicht aufzählbare eigene Eigenschaften haben können, z Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'}).
RobG
2
Diese Lösung ist eine Möglichkeit, nach vorhandenen Schlüsseln zu suchen. Die wahre, effiziente und korrekteste Antwort finden Sie weiter unten mit Object.keys (x) .length. Sie müssen keine eigene Funktion erstellen, eine existiert bereits!
Dudewad
192

Mit der integrierten Object.keysMethode können Sie eine Liste der Schlüssel für ein Objekt abrufen und dessen Länge testen.

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}
Dhaval Chaudhary
quelle
13
Das hier ist die richtige Antwort. Die oben akzeptierte Antwort ist eine Umgehung und teurer als nur die Überprüfung der Anzahl der Schlüssel. das macht viel mehr Sinn .
Dudewad
6
Object.keys ("mystring"); liefert auch Schlüssel, die ich für unerwünscht halte. Diese Antwort ist meiner Meinung nach unvollständig.
Mike de Klerk
2
@MikedeKlerk bitte sorgfältig lesen, es ist nicht Object.keys ("mystring"); Es sind Object.keys (objectVariableName), die ein Array aller Schlüssel im Objekt zurückgeben. Beispiel: {'x': 'abc', 'y': 'def'} es wird ['x', 'y'] sein
Dhaval Chaudhary
3
@DhavalChaudhary Vielen Dank für Ihre Antwort auf meinen Kommentar. Wenn ich diesen Code versuche var str = "MyString"; Object.keys(str);, gibt die Konsole für jedes Zeichen 8 Tasten von 0 bis 7 aus. Oder verstehe ich die Antwort immer noch nicht.
Mike de Klerk
6
@MikedeKlerk, aber es ist nur eine Lösung für Objekte, nicht für Zeichenfolgen.
Dhaval Chaudhary
111

Was ist mit einer einfachen Funktion?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false

Der hasOwnPropertyMethodenaufruf direkt auf dem Object.prototypedient nur dazu, etwas mehr Sicherheit zu bieten. Stellen Sie sich Folgendes mit einem normalen obj.hasOwnProperty(...)Aufruf vor:

isEmptyObject({hasOwnProperty:'boom'});  // false

Hinweis: (für die Zukunft) Die obige Methode basiert auf der for...inAnweisung, und diese Anweisung iteriert nur über aufzählbare Eigenschaften. Im derzeit am weitesten verbreiteten ECMAScript-Standard (3. Ausgabe) hat der Programmierer keine Möglichkeit, nicht aufzählbare Eigenschaften zu erstellen .

Dies hat sich jedoch jetzt mit ECMAScript 5th Edition geändert , und wir können nicht aufzählbare, nicht beschreibbare oder nicht löschbare Eigenschaften erstellen, sodass die oben beschriebene Methode fehlschlagen kann , z.

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!

Eine ECMAScript 5-Lösung für dieses Problem wäre:

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

Das Object.getOwnPropertyNames Methode gibt ein Arraydie Namen enthält alle die eigenen Eigenschaften eines Objekts, zählbare oder nicht , dieses Verfahren wird nun durch Browser - Anbieter implementiert, es ist bereits auf dem Chrome 5 Beta und die neuesten WebKit Nightly Builds.

Object.defineProperty ist auch in diesen Browsern und den neuesten Firefox 3.7 Alpha-Versionen verfügbar.

CMS
quelle
1
Was ist der Vorteil von Object.prototype.hasOwnProperty.call (obj, prop) gegenüber obj.hasOwnProperty (prop)?
Casey Chu
3
@Casey, bearbeitet, wenn ein Objekt die hasOwnPropertyEigenschaft überschreibt , kann die Funktion abstürzen ... Ich weiß, dass ich ein bisschen paranoid bin ... aber manchmal weiß man nicht, in welcher Umgebung Ihr Code verwendet wird, aber Sie wissen, welche Methode Sie verwenden möchten ...
CMS
2
+1 für die Beantwortung dieser Frage ... und anderer Fragen der Zukunft! :)
Daniel Vassallo
1
Beachten Sie, dass es im IE auch einen Fehler gibt, bei dem eine Eigenschaft mit einem Namen, der mit einer nicht aufzählbaren Eigenschaft in übereinstimmt Object.prototype, nicht von aufgezählt wird for...in. Also isEmptyObject({toString:1})wird scheitern. Dies ist einer der unglücklichen Gründe können Sie nicht ganz nutzen Objectals Allzweck-Mapping.
Bobince
1
@ MichaelMartin-Smucker - Schlüssel geben nur unzählige eigene Eigenschaften zurück, daher hier nicht geeignet.
RobG
58

Mit jQuery können Sie Folgendes verwenden:

$.isEmptyObject(obj); // Returns: Boolean

Ab jQuery 1.4 überprüft diese Methode sowohl Eigenschaften des Objekts selbst als auch Eigenschaften, die von Prototypen geerbt wurden (da hasOwnProperty nicht verwendet wird).

Mit ECMAScript 5th Edition in modernen Browsern (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) können Sie die integrierte Object.keys- Methode verwenden:

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;

Oder einfaches altes JavaScript:

var isEmpty = function(obj) {
               for(var p in obj){
                  return false;
               }
               return true;
            };
kayz1
quelle
13

Wenn Sie underscore.js verwenden, können Sie die Funktion _.isEmpty verwenden:

var obj = {};
var emptyObject = _.isEmpty(obj);
Gruff Bunny
quelle
1
Nur für alle, die vorbeikommen, ist dies keine Methode für Objekte. _.isEmpty([]) // true Überprüfen Sie zuerst: stackoverflow.com/a/22482737/1922747
djv
11

Wenn Sie bereit sind, lodash zu verwenden , können Sie die someMethode verwenden.

_.some(obj) // returns true or false

Siehe dieses kleine jsbin- Beispiel

sfs
quelle
var x = [1,2] // true
djv
@damionjn Ich habe Ihren Code zum Beispiel hinzugefügt. Ich sehe Ihren Standpunkt darin, dass das Array die falsche Antwort zurückgibt, aber OP hat zunächst eine Variable als Objekt deklariert, daher glaube ich, dass es in Ordnung ist, dies anzunehmen. Es gibt eine Antwort oben, die die Unterstriche isEmpty-Methode verwendet (lodash hat dieselbe Methode). Diese Antwort hat genau das gleiche Problem. Wenn Sie isEmpty ein nicht leeres Array geben, erhalten Sie auch das falsche Ergebnis.
SFS
Fair genug, aber wir sollten Antworten mit allen Grundlagen geben, um die besten Praktiken zu gewährleisten. Du hast recht, ich bin ohne Kritik an seiner Antwort vorbeigekommen. Nur für alle, die vorbeikommen, ist dies keine Methode für Objekte. _.some([1, 2]) // true Überprüfen Sie zuerst: stackoverflow.com/a/13356338/1922747
djv
5
for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties

Wenn Sie sicher sein und nach Objektprototypen suchen müssen (diese werden von bestimmten Bibliotheken hinzugefügt und sind dort nicht standardmäßig vorhanden):

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties
Casey Chu
quelle
1
In Ihrer Lösung gibt es keine Filterung für unerwünschte Prototypeneigenschaften. Dies bedeutet, dass es sich möglicherweise schlecht verhält, wenn Sie eine Bibliothek wie Prototype.js verwenden oder ein unerfahrener Benutzer dem Objekt zusätzliche Prototypeigenschaften hinzufügt. Schauen Sie sich Daniels Lösung auf dieser Seite an.
Joscha
Sie müssen keine Bibliothek verwenden oder unerfahren sein, um den Prototyp eines Objekts zu erweitern. Einige erfahrene Programmierer tun dies die ganze Zeit.
Alsciende
2
for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

Member bedeutet Member-Eigenschaft, Member-Variable, wie auch immer Sie sie nennen möchten> _>

Der obige Code gibt ALLES zurück, einschließlich toString ... Wenn Sie nur sehen möchten, ob der Prototyp des Objekts erweitert wurde:

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

Hinweis A: Wir prüfen, ob das Mitglied des Dummy-Objekts denselben Typ wie das Mitglied unseres Testobjekts hat. Wenn es sich um eine Erweiterung handelt, sollte der Elementtyp des Dummyobjekts "undefiniert" sein.

Warty
quelle
Hallo, kann ich nur wissen, ob ein Objekt Eigenschaften enthält oder nicht? Danke
Ricky
In Ihrer Lösung gibt es keine Filterung für unerwünschte Prototypeneigenschaften. Dies bedeutet, dass es sich möglicherweise schlecht verhält, wenn Sie eine Bibliothek wie Prototype.js verwenden oder ein unerfahrener Benutzer dem Objekt zusätzliche Prototypeigenschaften hinzufügt.
Joscha
Schauen Sie sich Daniels Lösung auf dieser Seite an - sie ist weniger fehleranfällig!
Joscha
2
Ihr erster Codeblock deckt ihn überhaupt nicht ab. Der zweite Codeblock verhält sich schlecht, wenn ich dem undefinierten "ad" -Objekt eine Variable hinzufüge. Schauen Sie sich Daniels Antwort an, sie ist die einzig richtige und schnellste, da sie eine native Implementierung namens "hasOwnProperty" verwendet.
Joscha
@ Ricky: Wenn Sie überprüfen möchten, ob ein Objekt Eigenschaften enthält, können Sie einfach das Beispiel in meiner Antwort verwenden: stackoverflow.com/questions/2673121/… . Wenn der Code den Kommentar erreicht, hat Ihr Objekt keine direkten Eigenschaften. Wenn nicht, würde es.
Daniel Vassallo
2
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

Einfach, funktioniert in jedem Browser und obwohl es technisch gesehen eine Schleife für alle Schlüssel des Objekts ist , durchläuft es NICHT alle ... entweder gibt es 0 und die Schleife läuft nicht oder es gibt einige und sie bricht nach der ersten eins (weil wir nur prüfen, ob es JEDEN gibt ... warum also weitermachen?)

Jimbo Jonny
quelle
1

Sehr späte Antwort, aber so könnten Sie mit Prototypen umgehen.

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}
Profitieren
quelle
0

Wenn Sie sicher sind, dass das Objekt benutzerdefiniert ist, können Sie am einfachsten feststellen, ob UDO leer ist: Der folgende Code:

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

Obwohl diese Methode (von Natur aus) deduktiv ist, ist sie die schnellste und schnellste.

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

ps :! nicht für browserdefinierte Objekte verwenden.

Bill die Eidechse
quelle
... 0 zurückgeben; return 1}; wäre das gleiche?
Commonpike
1
@pike nein, return! 1; return! 0 ist dasselbe wie return false; return true
Christophe
0

Späte Antwort, aber einige Frameworks behandeln Objekte als Aufzählungen. Daher kann bob.js dies folgendermaßen tun:

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();
Tengiz
quelle
0

Sie können Folgendes verwenden:

Doppelknall !! Immobiliensuche

var a = !![]; // true
var a = !!null; // false

hasOwnProperty Dies ist etwas, das ich verwendet habe:

var myObject = {
  name: 'John',
  address: null
};
if (myObject.hasOwnProperty('address')) { // true
  // do something if it exists.
}

JavaScript hat jedoch beschlossen, den Namen der Methode nicht zu schützen, damit er manipuliert werden kann.

var myObject = {
  hasOwnProperty: 'I will populate it myself!'
};

Requisite in myObject

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.

Art der

if (typeof myObject.name !== 'undefined') {
  // do something
}

Es wird jedoch nicht nach null gesucht.

Ich denke, das ist der beste Weg.

im Betreiber

var myObject = {
  name: 'John',
  address: null
};

if('name' in myObject) {
  console.log("Name exists in myObject");
}else{
  console.log("Name does not exist in myObject");
}

Ergebnis:

Name existiert in myObject

Hier ist ein Link, der detaillierter auf den Operator in eingeht: Feststellen, ob eine Objekteigenschaft vorhanden ist

James Drinkard
quelle
0

ES6- Funktion

/**
 * Returns true if an object is empty.
 * @param  {*} obj the object to test
 * @return {boolean} returns true if object is empty, otherwise returns false
 */
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0

Beispiele:


let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false
Sébastien
quelle
-1

Wie wäre es damit?

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj
Peter Toth
quelle
Diese Antwort beantwortet die Frage nicht. OP fragt, ob ein Objekt benutzerdefinierte Eigenschaften enthält. Ihre Antwort prüft, ob das Objekt selbst in einen booleschen falschen Wert konvertiert wird.
Jasmonate
... und später wurde mir auch klar, dass James diese Option bereits in seine Antwort aufgenommen hatte. Tut mir leid, Leute.
Peter Toth