我需要检查属性是否包含属性,现在我正在使用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);
}
}
}
}
答案 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
}