Wie überprüfe ich, ob eine Objekteigenschaft mit einer Variablen vorhanden ist, die den Eigenschaftsnamen enthält?

680

Ich überprüfe das Vorhandensein einer Objekteigenschaft mit einer Variablen, die den fraglichen Eigenschaftsnamen enthält.

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

Das liegt undefineddaran, dass es gesucht wird, myObj.myPropaber ich möchte, dass es danach suchtmyObj.prop

Pisten kreativ
quelle
2
Möglicherweise nützlich: Aus einem Kommentar von Pablo Cabrera bei NCZOnline : "Ich denke, es ist erwähnenswert, dass hasOwnPropertySie sich auf das verlassen können , wenn die Methode überschrieben wird Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise
10
ist stackoverflow.com/questions/4244896/... ein Duplikat dieser Frage? wie ist das? "Existenzprüfung" und "Zugriff auf Wert" sind verschiedene Dinge? Bitte korrigieren Sie mich, wenn ich falsch
liege
Dies ist kein Duplikat.
Jeff Clayton

Antworten:

1307
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

Oder

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

Oder

if('prop' in myObj){
    alert("yes, i have that property");
}

Beachten Sie, dass hasOwnPropertynicht nach geerbten Eigenschaften gesucht inwird. Zum Beispiel 'constructor' in myObjist wahr, aber myObj.hasOwnProperty('constructor')nicht.

Rakete Hazmat
quelle
23
hasOwnProperty()ist besser als myObj[myProp](aus anderen Antworten), da es funktioniert, auch wenn der Wert von myProp0 ist
Matt R
9
Der Operator "in" funktioniert nicht mit Zeichenfolgen. Beispiel: 'Länge' in 'qqq' erzeugt eine Ausnahme. Wenn Sie also eine allgemeine Überprüfung wünschen, müssen Sie hasOwnProperty verwenden.
Jacob
1
@Jacob was meinst du, wenn du sagst 'Der "in" Operator funktioniert nicht mit Strings'? Mit dem Operator "in" muss der linke Ausdruck eine Zeichenfolge oder ein Wert sein, der in eine Zeichenfolge konvertiert werden kann. Ja, Sie können 'Länge' nicht in 'qqq' schreiben, aber Sie können auch nicht 'qqq' schreiben. HatOwnProperty ('Länge')
Wachburn
2
@Wachburn: 'qqq'.hasOwnProperty('length')ist true, das kannst du machen.
Rocket Hazmat
1
@ gaurav5430 Ich glaube, ich beziehe mich darauf, dass wenn myProp0 ist, die if-Anweisung so aussehen würde, if (myObj[0])wenn wenn myObjüberhaupt irgendwelche Eigenschaften vorhanden wären, würde der Ausdruck ausgewertet true. Und myObj[0]möglicherweise nicht die Immobilie, die Sie suchen.
Matt R
51

Sie können hasOwnProperty verwenden , aber basierend auf der Referenz benötigen Sie Anführungszeichen, wenn Sie diese Methode verwenden:

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

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

Eine andere Möglichkeit ist die Verwendung im Operator, aber Sie benötigen auch hier Anführungszeichen :

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

Adorjan Princz
quelle
6
Das ist nicht , wie hasOwnProperty()implementiert wird.
Kanon
7
Das ist falsch. Wenn Sie den Namen myProp in Anführungszeichen setzen, verweisen Sie nicht mehr auf den Wert von myProp, sondern deklarieren einen neuen String () von 'myProp', und in myObj gibt es keine solche Eigenschaft von 'myProp'.
TriumphST
1
TriumpST: aus dem oben verlinkten MDN: "prop - Eine Zeichenfolge oder ein Symbol, das einen Eigenschaftsnamen oder einen Array-Index darstellt (Nicht-Symbole werden zu Zeichenfolgen gezwungen)."
Ben Creasy
Das ist richtig. Wenn Sie keine Variable verwenden möchten, sondern nur ein bestimmtes 'myProp' vorhanden ist, benötigen Sie die Anführungszeichen.
Katinka Hesselink
@KatinkaHesselink: Dein Kommentar ist irreführend. Die Frage lautete: "Wie wird überprüft, ob eine Objekteigenschaft mit einer Variablen vorhanden ist, die den Eigenschaftsnamen enthält?"
Herbert Van-Vliet
26

Vielen Dank für die Unterstützung und das Bestreben, die eval-Erklärung loszuwerden. Variablen mussten in Klammern stehen, nicht in Punktnotation. Dies funktioniert und ist sauberer, korrekter Code.

Jede dieser Variablen ist: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
Pisten kreativ
quelle
Das scheint mir ein Problem zu sein. Wenn tData.tonicdata[appChoice]sich ein Wert ergibt, dessen Eigenschaft / Index nicht übereinstimmt underI, wird ein Wert TypeErrorausgelöst.
Ynot
Trotz Ihrer Absichten mit Ihrem ersten Beitrag haben Sie tatsächlich eine andere Frage gestellt als die, für die Sie diese Antwort gegeben haben. Sie wollten die Existenz einer Immobilie überprüfen, Sie erwähnen nichts darüber, wie Sie darauf zugreifen können. Das macht diese Antwort unabhängig von der eigentlichen Frage.
Futter
18

Für eigenes Eigentum:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

Hinweis: Die Verwendung von Object.prototype.hasOwnProperty ist besser als credit.hasOwnProperty (..), falls in der Prototypenkette eine benutzerdefinierte hasOwnProperty definiert ist (was hier nicht der Fall ist)

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

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

So schließen vererbten Eigenschaften in der Erkenntnis , die Verwendung in Operator: (aber Sie müssen ein Objekt auf der rechten Seite platzieren ‚in‘, primitive Werte werden Fehler aus, zum Beispiel ‚Länge‘ in ‚Heimat‘ wird Fehler werfen, aber ‚Länge‘ in neuem String ('home') nicht)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

Hinweis: Es könnte versucht sein, typeof und [] property accessor als folgenden Code zu verwenden, der nicht immer funktioniert ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}
adnan2nd
quelle
13

Eine viel sicherere Möglichkeit, um zu überprüfen, ob eine Eigenschaft für das Objekt vorhanden ist, besteht darin, ein leeres Objekt oder einen Objektprototyp zum Aufrufen zu verwenden hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

Referenz aus MDN-Webdokumenten - Object.prototype.hasOwnProperty ()

skmasq
quelle
4
Wenn Sie JavaScript einbinden, das möglicherweise etwas Böses wie Überschreiben bewirkt hasOwnProperty, wird Ihr Code durch keine solche Anzahl von Wachen sicher oder geschützt.
Meustrus
@meustrus Ich weiß, woher Sie kommen, aber aus geschäftlicher Sicht ist es sehr wahrscheinlich, dass ein unerfahrener Entwickler diesen Eigenschaftsnamen verwendet, was nicht unbedingt bedeutet, dass er absichtlich etwas Böses tut.
Skmasq
4

Sie können hasOwnProperty()sowohl als inOperator verwenden.

Simran Kaur
quelle
All dies ist der Grund, warum ich Javascript hasse
pwaterz
1
@pwaterz hasse den Spieler nicht 🙄
ArchNoob
Haha, ich liebe es :)
pwaterz