检查对象成员是否存在于嵌套对象中

有没有比___ in object使用___ in object更简单的方法来检查___ in object的每个级别的存在来检查单个成员的存在?

更简洁:如何检查someObject.member.member.member.value是否存在?

一般来说,你可以使用if(property in object) ,但是这对嵌套成员来说仍然很麻烦。

你可以写一个函数:

 function test(obj, prop) { var parts = prop.split('.'); for(var i = 0, l = parts.length; i < l; i++) { var part = parts[i]; if(obj !== null && typeof obj === "object" && part in obj) { obj = obj[part]; } else { return false; } } return true; } test(someObject, 'member.member.member.value'); 

DEMO

你也可以尝试/捕获TypeError?

 try { console.log(someObject.member.member.member.value); } catch(e) { if (e instanceof TypeError) { console.log("Couldn't access someObject.member.member.member.value"); console.log(someObject); } } 

这里有一个方法: http : //jsfiddle.net/9McHq/

 var result = ((((someObject || {}).member || {}).member || {}).member || {}).value; alert( result ); 
 if (someObject.member && someObject.member.member && someObject.member.member.member && someObject.member.member.member.value) ... 

或类似地:

 var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value; 

如果任何特定的值发生为nullfalse0或者"" (一个空string),这将不会“工作”,但是可能的例外是最终值,这似乎不太可能。

另外,请注意typeof ____ !== "undefined"不是正确的testing,以查看对象是否具有属性。 相反,你应该___ in object使用___ in object ,例如if ("member" in someObject) 。 这是因为您可以将属性设置为undefined的显式值,这与使用delete someObject.member删除它不同。

像(警告:未经testing的代码)

 var testProperty = function(obj, proplist) { for (var i=0; i < proplist.length; i++) { if (obj.hasOwnProperty(proplist[i])) { obj = obj[proplist[i]]; } else { return false; } } return true; } 

在这里定义的safeRead函数在codeabode上允许safeRead的嵌套属性即

 safeRead(foo, 'bar', 'jim', 'jam'); 

如果任何属性为空或未定义,则返回一个空string – 对格式化/string插值很有用

如果你可以使用lodash库,它有一个非常优雅的解决scheme, hasIn

 _.hasIn(someObject, 'member.level1.level2.level3'); 

例如,

 var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}} // => undefined _.hasIn(obj, 'x') // => true _.hasIn(obj, 'abd') // => true _.hasIn(obj, 'abe') // => false