Comment vérifier si une propriété d'objet existe avec une variable contenant le nom de la propriété?

682

Je vérifie l'existence d'une propriété d'objet avec une variable contenant le nom de la propriété en question.

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

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

C'est undefinedparce qu'il cherche myObj.myPropmais je veux qu'il vérifiemyObj.prop

Slopeside Creative
la source
2
Peut-être utile: D'après un commentaire de Pablo Cabrera sur NCZOnline : "Je pense qu'il vaut la peine de noter que si la hasOwnPropertyméthode est écrasée, vous pouvez compter sur le Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise
10
stackoverflow.com/questions/4244896/… est-il un double de cette question? comment c'est? «vérifier l'existence» et «accéder à la valeur» sont des choses différentes? Veuillez me corriger si je me trompe ....
adnan2nd
ce n'est pas un doublon.
Jeff Clayton

Réponses:

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

Ou

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

Ou

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

Notez que hasOwnPropertyne vérifie pas les propriétés héritées, alors que le infait. Par exemple, 'constructor' in myObjc'est vrai, mais ce myObj.hasOwnProperty('constructor')n'est pas le cas.

Rocket Hazmat
la source
23
hasOwnProperty()est mieux alors myObj[myProp](à partir d'autres réponses) car cela fonctionne même si la valeur de myPropest 0
Matt R
9
L'opérateur "in" ne fonctionne pas avec les chaînes. Par exemple, «longueur» dans «qqq» produira une exception. Donc, si vous voulez une vérification à usage général, vous devez utiliser hasOwnProperty.
Jacob
1
@Jacob que voulez-vous dire lorsque vous dites que "l'opérateur" in "ne fonctionne pas avec les chaînes"? avec l'opérateur "in" ', l'expression de gauche doit être une chaîne ou une valeur qui peut être convertie en chaîne. Oui, vous ne pouvez pas écrire «longueur» dans «qqq» mais vous ne pouvez pas non plus écrire «qqq». HasOwnProperty («longueur»)
Wachburn
2
@Wachburn: 'qqq'.hasOwnProperty('length')est true, vous pouvez le faire.
Rocket Hazmat
1
@ gaurav5430 Je pense que ce à quoi je fais référence, c'est que si myPropest 0, l'instruction if ressemblerait à if (myObj[0])laquelle if myObja des propriétés, l'expression exprimerait true. Et ce myObj[0]n'est peut-être pas la propriété que vous recherchez.
Matt R
52

Vous pouvez utiliser hasOwnProperty , mais en fonction de la référence, vous avez besoin de guillemets lorsque vous utilisez cette méthode:

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

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

Une autre façon est d'utiliser dans l' opérateur, mais vous avez besoin de devis ici aussi:

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

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

Adorjan Princz
la source
6
Ce n'est pas ainsi que l' hasOwnProperty()on met en œuvre.
canon
7
Ceci est une erreur. En mettant des guillemets autour du nom myProp, vous ne faites plus référence à la valeur de myProp, vous déclarez plutôt une nouvelle chaîne () de 'myProp' et il n'y a pas une telle propriété de 'myProp' dans myObj.
TriumphST
1
TriumpST: à partir du MDN lié ci-dessus, "prop - Une chaîne ou un symbole représentant un nom de propriété ou un index de tableau (les non-symboles seront forcés en chaînes)."
Ben Creasy
C'est correct. Si vous ne voulez pas utiliser une variable, mais juste si un «myProp» spécifique est présent, vous avez besoin des guillemets.
Katinka Hesselink
@KatinkaHesselink: Votre commentaire est trompeur. La question était "Comment vérifier si une propriété d'objet existe avec une variable contenant le nom de la propriété?"
Herbert Van-Vliet du
26

Merci pour l'assistance de tout le monde et pour avoir poussé à se débarrasser de la déclaration eval. Les variables devaient être entre parenthèses, pas la notation par points. Cela fonctionne et est un code propre et correct.

Chacune de ces variables est: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
Slopeside Creative
la source
Cela me semble un problème. Si tData.tonicdata[appChoice]résulte une valeur qui n'a pas de propriété / index qui correspond underI, alors cela se traduira par une TypeErrorlevée.
Ynot
Malgré vos intentions avec votre message initial, vous avez en fait posé une question différente de celle pour laquelle vous avez fourni cette réponse. Vous vouliez vérifier l'existence d'un bien, vous ne mentionnez rien sur la façon d'y accéder. Ce qui rend cette réponse sans rapport avec la question réelle.
Forage
19

Pour sa propre propriété:

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

Remarque: il est préférable d' utiliser Object.prototype.hasOwnProperty que loan.hasOwnProperty (..), dans le cas où un hasOwnProperty personnalisé est défini dans la chaîne de prototypes (ce qui n'est pas le cas ici), comme

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

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

Pour inclure des propriétés héritées dans la recherche, utilisez l' opérateur in : (mais vous devez placer un objet sur le côté droit de 'in', les valeurs primitives génèreront une erreur, par exemple 'length' dans 'home' générera une erreur, mais 'length' dans la nouvelle chaîne ('home') ne le sera pas)

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

Remarque: On peut être tenté d'utiliser l'accesseur typeof et [] comme code suivant qui ne fonctionne pas toujours ...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

Un moyen beaucoup plus sûr de vérifier si une propriété existe sur l'objet est d'utiliser un objet vide ou un prototype d'objet pour appeler 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

Référence à partir des documents Web MDN - Object.prototype.hasOwnProperty ()

skmasq
la source
4
Si vous incorporez du hasOwnPropertycode JavaScript qui pourrait faire quelque chose de mal comme l'annulation , aucune quantité de gardes comme celle-ci ne rendra votre code sûr ou sécurisé.
meustrus
@meustrus Je sais d'où vous venez, mais du point de vue commercial, il est très possible de recevoir qu'un développeur inexpérimenté utilise ce nom de propriété, ce qui ne signifie pas nécessairement qu'il fait quelque chose de mal intentionnellement.
skmasq
4

Vous pouvez utiliser hasOwnProperty()ainsi que l' inopérateur.

Simran Kaur
la source
Tout cela ^ c'est pourquoi je déteste le javascript
pwaterz
1
@pwaterz ne déteste pas le joueur Arch
ArchNoob
Haha, j'adore :)
pwaterz