JavaScript如何测试是否存在嵌套的对象键?

  • 回答 (2)
  • 关注 (0)
  • 查看 (281)

如果我有一个对象的引用 -

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

扫码关注云+社区

领取腾讯云代金券