检查对象成员是否存在于嵌套对象中
有没有比___ 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 );
查看lodash-deep的deepHas
https://github.com/marklagendijk/lodash-deep#_deephascollection-propertypath
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;
如果任何特定的值发生为null
, false
, 0
或者""
(一个空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