如果我有一个对象的引用 -
var test = {};
这可能(但不是立即)嵌套对象,就像 -
{ level1:{level2:{level3:'level3'}} };
测试最深层嵌套对象中键的存在的最好方法是什么?
这个 -
alert(test.level1);
返回“未定义”,但是这个 -
alert(test.level1.level2.level3);
失败。
我目前正在做这样的事情 -
if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
alert(test.level1.level2.level3);
}
但我想知道是否有更好的方法。
如果你像字符串一样处理这个名字,你可以在任何深度读取一个对象属性't.level1.level2.level3'。
window.t={level1:{level2:{level3: 'level3'}}};
function deeptest(s){
s= s.split('.')
var obj= window[s.shift()];
while(obj && s.length) obj= obj[s.shift()];
return obj;
}
alert(deeptest('t.level1.level2.level3') || 'Undefined');
undefined如果有任何分段,则返回undefined。
如果你不想要a TypeError,你必须一步一步地做,因为如果其中一个成员是nullor undefined,并且你试图访问一个成员,则会抛出一个异常。
你可以简单catch的例外,或者做一个函数来测试多个层次的存在,像这样:
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < args.length; i++) {
if (!obj || !obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
var test = {level1:{level2:{level3:'level3'}} };
checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false