如何检查属性是否包含属性

时间:2013-03-27 02:33:30

标签: javascript properties conditional-statements

我需要检查属性是否包含属性,现在我正在使用if示例中的语句

下面是一个示例对象

var Foo = {
    "bar" : 
        {
            "foobar":
                {
                    "barfoo":1
                }
        }
}

我需要检查barfoo是否存在,但首先我需要检查是否存在所有其他属性,因为它们可能不依赖于是否已运行其他功能。我无法真正降低这种结构的水平,因此这不是一种选择。

目前我正在做类似的事情:

var d = Foo;
if (d) {
    d = d.bar;
    if (d) {
        d = d.foobar;
        if (d) {
            d = d.barfoo;
            if(d){
                console.log(d);
            }
        }
    }
}

4 个答案:

答案 0 :(得分:5)

您可以在一个if声明中完成所有操作:

if (d && d.bar && d.bar.foobar && d.bar.foobar.barfoo)

这是有效的,因为如果任何元素失败,javascript会停止检查if语句,因此它不会出现cannot check property of undefined之类的错误。

否则你可以使用try catch语句:

var barfoo;
try{
  barfoo = d.bar.foobar.barfoo
}
catch(e){
  barfoo = null;
}

答案 1 :(得分:2)

您可以使用&&执行单个if语句 - 这可以进行短路评估。

if (d
    && d.hasOwnProperty('bar')
    && d.bar.hasOwnProperty('foobar')
    && d.bar.foobar.hasOwnProperty('barfoo')
) {
    // fancy things happen
}

您使用d.hasOwnProperty('bar')而非d.bar的原因是因为某些内容污染了对象原型。

答案 2 :(得分:2)

更强大的解决方案:检查对象的任何深度

var Foo = {
    "bar": {
        "foobar": {
            "barfoo": {
                "ddd": 1
            }
        }
    }
};

function checkProps(obj) {
    var ref = obj, arg, i;
    for (i = 1; i < arguments.length; i += 1) {
        arg = arguments[i];
        if(ref.hasOwnProperty(arg)){
            ref = ref[arg]
        } else {
            return false;
        }
    }
    return true;
}
//the function takes the object to search as first parameter and any other properties [,prop1,prop2,...]
console.log(checkProps(Foo, 'bar', 'foobar', 'barfoo', 'ddd'));

答案 3 :(得分:0)

如果你需要知道的是它是否存在,你可以用try / catch

来做
  

尝试{

  if (Foo.bar.foobar.barfoo) {

      //do stuff with your thingy because you know it exists

  }
     

} catch(x){

     //you know it's no good/doesn't exist
     

}