测试嵌套JavaScript对象键的存在性

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

var test = {};

这可能会(但不是立即)嵌套对象,如下所示:

{level1: {level2: {level3: "level3"}}};

测试最深层嵌套对象中密钥的存在的最佳方法是什么?

alert(test.level1); 产量undefined ,但alert(test.level1.level2.level3); 失败。

我目前正在做这样的事情:

if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
    alert(test.level1.level2.level3);
}

但我想知道是否有更好的方法。


如果您不想要TypeError ,则必须一步一步完成,因为如果其中一个成员为nullundefined ,并且您尝试访问成员,则将抛出异常。

您可以简单地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

这是我从Oliver Steele领取的一种模式:

var level3 = (((test || {}).level1 || {}).level2 || {}).level3;
alert( level3 );

事实上,整篇文章是关于如何在JavaScript中实现这一点的讨论。 他决定使用上面的语法(一旦习惯了就不难读懂)作为一个习惯用法。


更新

看起来lodash已经为所有你需要的嵌套属性添加了_.get

_.get(countries, 'greece.sparta.playwright')

https://lodash.com/docs#get


先前的回答

lodash用户可能会喜欢lodash.contrib,它有一些方法可以缓解这个问题。

的getPath

签名: _.getPath(obj:Object, ks:String|Array)

根据给定键所描述的路径,获取嵌套对象中任何深度的值。 键可以作为数组或点分隔的字符串给出。 如果路径无法到达,则返回undefined

var countries = {
        greece: {
            athens: {
                playwright:  "Sophocles"
            }
        }
    }
};

_.getPath(countries, "greece.athens.playwright");
// => "Sophocles"

_.getPath(countries, "greece.sparta.playwright");
// => undefined

_.getPath(countries, ["greece", "athens", "playwright"]);
// => "Sophocles"

_.getPath(countries, ["greece", "sparta", "playwright"]);
// => undefined
链接地址: http://www.djcxy.com/p/70101.html

上一篇: Test for existence of nested JavaScript object key

下一篇: difference between for loop and for