您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

如果您不想要a,则必须分步执行,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

这是原始功能的简化版本,使用了ES6功能和递归功能(也采用正确的尾调用形式):

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

在可选的链接建议对达到第3阶段ECMAScript委员会的过程,这将让你安全地访问深度嵌套的性质,通过使用令牌?.,新的 可选链接操作

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

如果所访问的任何级别是nullundefined表达式将undefined自行解析为。

该建议还允许您安全地处理方法调用

obj?.level1?.method();

上面的表达式将产生undefined如果objobj.level1或者obj.level1.methodnullundefined,否则会调用函数

从Babel 7.8.0开始,认情况下支持ES2020

可选的链接建议最终在TC39委员会的2019年12月会议上达到了第4阶段。这意味着此功能将成为 标准的一部分。

javascript 2022/1/1 18:16:42 有548人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶