Javascript 如何检查属性是否包含属性
我需要检查属性是否包含属性,现在我使用的是示例中的if语句 下面是一个示例对象Javascript 如何检查属性是否包含属性,javascript,properties,conditional-statements,Javascript,Properties,Conditional Statements,我需要检查属性是否包含属性,现在我使用的是示例中的if语句 下面是一个示例对象 var Foo = { "bar" : { "foobar": { "barfoo":1 } } } 我需要检查barfoo是否存在,但首先我需要检查所有其他属性是否存在,因为它们可能不取决于是否运行了另一个函数。我也不能真正降低这个结构的级别,所
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);
}
}
}
}
您可以在一个if语句中完成这一切:
if (d && d.bar && d.bar.foobar && d.bar.foobar.barfoo)
var barfoo;
try{
barfoo = d.bar.foobar.barfoo
}
catch(e){
barfoo = null;
}
这是因为javascript在任何元素失败时都会停止检查if语句,因此不会出现类似undefined的cannotcheck属性的错误
否则,可以使用try-catch语句:
if (d && d.bar && d.bar.foobar && d.bar.foobar.barfoo)
var barfoo;
try{
barfoo = d.bar.foobar.barfoo
}
catch(e){
barfoo = null;
}
您只需使用&-,执行一个if语句,该语句执行短路计算
if (d
&& d.hasOwnProperty('bar')
&& d.bar.hasOwnProperty('foobar')
&& d.bar.foobar.hasOwnProperty('barfoo')
) {
// fancy things happen
}
使用d.hasOwnProperty'bar而不仅仅是d.bar的原因是为了防止对象原型受到污染。如果您只需要知道它是否存在,只需尝试一下即可 试一试{ }卡克斯{
//you know it's no good/doesn't exist
}
更稳健的解决方案:检查对象的任何深度
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'));
为什么我没有想到那个O.O有时我甚至都不想。谢谢这是对另一个答案的评论吗?对不起。单次调用似乎更好。你说我也不能真正降低这种结构的级别是什么意思,所以这不是一种选择?如果你绝对需要嵌套的条件,那么你做得很好。+1我想建议类似的东西,但是传递一个带有目标路径的字符串,比如bar.foobar.barfoo.ddd,然后拆分它并循环。另外,它的一个变体可能会返回目标属性的值,或者如果未找到未定义的,则返回未定义的值,因为当您尝试在单个级别上读取不存在的属性时,会得到未定义的值。如果ref==0,会发生什么情况?这意味着它将返回FALSWALL&&ref!==解决这个问题?很好的解决方案。不过我会做一点小小的改变。Object.prototype.checkProps=函数{},并将obj更改为此。然后你就可以做:Foo.checkProps'bar'、'foobar'、'barfoo'、'ddd'@检查的智能柠檬!==0是不够的,它仍然会为null、undefined和false本身返回false。如果检查继承的属性,会更安全,但显然不起作用。有效,但可能会影响性能,特别是在多次使用时。