gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:39:49 26 4
gpt4 key购买 nike

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

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 ,并且您尝试访问成员,将抛出异常。

您可以简单地捕获异常,或者创建一个函数来测试多个级别的存在,如下所示:

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 特性和递归(它也是 proper tail call 形式):

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 更新:

optional chaining proposalECMAScript committee process 上达到第 3 阶段, 这将允许您通过使用 token ?. 安全地访问深层嵌套的属性,新的可选链接运算符:

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

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

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

obj?.level1?.method();

如果 objobj.level1obj.level1.method,上述表达式将产生 undefinednullundefined,否则会调用该函数。

您可以使用 optional chaining plugin 开始使用 Babel 的此功能。 .

Babel 7.8.0 , 默认支持ES2020

检查 this example在 Babel REPL 上。

🎉🎉更新:2019 年 12 月 🎉🎉

最终的可选链接提案 reached Stage 4在 TC39 委员会 2019 年 12 月的 session 上。这意味着此功能将成为 ECMAScript 2020 标准的一部分。

关于javascript - 测试是否存在嵌套的 JavaScript 对象键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47964931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com