如果你不想的话就必须一步一步来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(使用前将#替换为@)