测试嵌套 JavaScript 对象键是否存在

2023-11-25

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

var test = {};

可能(但不是立即)有嵌套对象,例如:

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

检查深层嵌套对象中是否存在属性的最佳方法是什么?

alert(test.level1); yields undefined, but alert(test.level1.level2.level3); fails.

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

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

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


如果你不想的话就必须一步一步来TypeError因为如果其中一名成员是null or 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

ES6 更新:

这是原始函数的较短版本,使用 ES6 功能和递归(它也在正确的尾调用 form):

function checkNested(obj, level,  ...rest) {
  if (obj === undefined) return false
  if (rest.length == 0 && obj.hasOwnProperty(level)) return true
  return checkNested(obj[level], ...rest)
}

但是,如果您想获取嵌套属性的值,而不仅仅是检查它是否存在,这里有一个简单的单行函数:

function getNested(obj, ...args) {
  return args.reduce((obj, level) => obj && obj[level], obj)
}

const test = { level1:{ level2:{ level3:'level3'} } };
console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'
console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6
console.log(getNested(test, 'level1', 'level2', 'foo')); // undefined
console.log(getNested(test, 'a', 'b')); // undefined

上面的函数允许你获取嵌套属性的值,否则将返回undefined.

2019 年 10 月 17 日更新:

The 可选的链接提案达到第 3 阶段ECMAScript 委员会流程,这将允许您通过使用令牌安全地访问深层嵌套的属性?., 新的可选的链接运算符:

const value = obj?.level1?.level2?.level3 

如果访问的任何级别是null or undefined该表达式将解析为undefined通过它自己。

该提案还允许您安全地处理方法调用:

obj?.level1?.method();

上述表达式将产生undefined if obj, obj.level1, or obj.level1.method are null or undefined,否则将调用该函数。

You can start playing with this feature with Babel using the optional chaining plugin.

Since 通天塔7.8.0,默认支持ES2020

Check 这个例子在 Babel REPL 上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试嵌套 JavaScript 对象键是否存在 的相关文章