web-dev-qa-db-ja.com

プロパティ名を保持する変数を持つオブジェクトプロパティが存在するかどうかを確認する方法

問題のプロパティ名を保持している変数を持つオブジェクトプロパティの存在を確認しています。

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

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

これはmyObj.myPropを探しているのでundefinedですが、私はそれがmyObj.propをチェックしたいのです

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

または

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

または

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

hasOwnProperty を使用できますが、このメソッドを使用する場合は、参照に基づいて quotes を使用します。

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

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

もう1つの方法は in 演算子を使用することですが、ここでも 引用符 が必要です。

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

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

40
Adorjan Princz

みなさんの支援とevalステートメントの削除を推進していただきありがとうございます。変数はドット表記ではなく大括弧で囲む必要があります。これは機能し、クリーンで適切なコードです。

これらはそれぞれ変数です:appChoice、underI、underObstr。

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
24

オブジェクトにプロパティが存在するかどうかを確認するためのもっと安全な方法は、空のオブジェクトまたはオブジェクトプロトタイプを使用して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

MDN Webドキュメント - Object.prototype.hasOwnProperty() からの参照

9
skmasq

自分の財産の場合:

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

注:Object.prototype.hasOwnPropertyを使用すると、カスタムhasOwnPropertyがプロトタイプチェーンで定義されている場合(ここではそうではありません)、loan.hasOwnProperty(..)よりも優れています。

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

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

継承されたプロパティを検索結果に含めるには、in演算子を使用します(ただし、 'in'の右側にオブジェクトを配置する必要があります。プリミティブ値は、たとえば'length' in 'home'はエラーをスローしますが、'string' in new String( 'home') not's)

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

注:typeofおよび[]プロパティアクセサーを次のコードとして使用するように誘惑される可能性があります常に動作しない ...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

in演算子と同様にhasOwnProperty()を使用できます。

2
Simran Kaur