如何检查嵌套的 JavaScript 对象键是否存在

要检查是否存在属性嵌套对象,我们应该逐步进行以避免 TypeError。

如果至少有一个成员为空或者未定义,并且我们尝试访问成员,则将抛出该错误。

有两种方法可以避免。
我们可以捕获异常或者创建一个函数来测试多个级别的存在,如下所示:

function checkNested(obj /*, level1, level2, ... levelN*/) {
  let 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;
}
let test = {
  level1: {
    level2: {
      level3: 'level3'
    }
  }
};
console.log(checkNested(test, 'level1', 'level2', 'level3')); //true
console.log(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

我们还可以使用可选运算符访问深度嵌套的属性,方法是使用令牌 ?.:

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

如果访问的任何给定级别为空或者未定义,则表达式将默认解析为未定义。

运算符还安全地处理方法调用:

obj ? .level1 ? .method();

如果 obj、obj.level1 或者 obj.level1.method 为 null 或者未定义,则上述表达式产生 undefined;否则,它将调用该函数。

可选链操作符

可选链运算符 (?.) 是一个提议,它允许读取位于连接对象链深处的属性的值,而无需明确验证每个引用是否有效。
这 ?

如果引用评估为空或者未定义,则运算符函数允许短路。

当与函数调用一起使用时,如果函数不存在,它返回 undefined。

日期:2020-06-02 22:16:09 来源:oir作者:oir