gpt4 book ai didi

javascript - 检查 JavaScript 中深层嵌套对象属性是否存在的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-02 23:15:15 25 4
gpt4 key购买 nike

我必须检查深层嵌套的对象属性,例如YAHOO.Foo.Bar.xyz

我当前使用的代码是

if (YAHOO && YAHOO.Foo && YAHOO.Foo.Bar && YAHOO.Foo.Bar.xyz) {
// operate on YAHOO.Foo.Bar.xyz
}

这可行,但看起来很笨拙。

有没有更好的方法来检查如此深层嵌套的属性?

最佳答案

如果您期望 YAHOO.Foo.Bar 是一个有效的对象,但又想让您的代码防弹,以防万一它不是,那么最干净的方法就是放置一个 try catch围绕它并让一个错误处理程序捕获任何丢失的段。然后,您可以只使用一个 if 条件(而不是四个)来检测终端属性是否存在,并使用 catch 处理程序来捕获中间对象不存在的情况:

try {
if (YAHOO.Foo.Bar.xyz) {
// operate on YAHOO.Foo.Bar.xyz
} catch(e) {
// handle error here
}

或者,根据您的代码的工作方式,它甚至可能只是这样:

try {
// operate on YAHOO.Foo.Bar.xyz
} catch(e) {
// do whatever you want to do when YAHOO.Foo.Bar.xyz doesn't exist
}

在处理应该具有特定格式的外部输入时,我特别使用这些,但无效输入是我想要捕获并处理自己的可能性,而不是仅仅让异常向上传播。

一般来说,一些 javascript 开发人员没有充分使用 try/catch。我发现有时可以用一个更大的函数 block 周围的单个 try/catch 来替换 5-10 个检查输入的 if 语句,同时使代码更简单且更具可读性。显然,何时合适取决于特定的代码,但这绝对值得考虑。

仅供引用,如果通常的操作是不使用 try/catch 抛出异常,它也可以比一堆 if 语句快得多。

<小时/>

如果您不想使用异常处理程序,您可以创建一个函数来测试任意路径:

function checkPath(base, path) {
var current = base;
var components = path.split(".");
for (var i = 0; i < components.length; i++) {
if ((typeof current !== "object") || (!current.hasOwnProperty(components[i]))) {
return false;
}
current = current[components[i]];
}
return true;
}

使用示例:

var a = {b: {c: {d: 5}}};
if (checkPath(a, "b.c.d")) {
// a.b.c.d exists and can be safely accessed
}

关于javascript - 检查 JavaScript 中深层嵌套对象属性是否存在的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6927242/

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