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

参见英文答案 > javascript test for existence of nested object key                                    3
我必须检查深入嵌套的对象属性,如YAHOO.Foo.Bar.xyz。

我目前使用的代码是

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

这有效,但看起来很笨拙。

有没有更好的方法来检查这样的深层嵌套财产?

最佳答案
有时,只需简单地尝试一下即可,而不用担心所有的中间细分:

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

或者,根据代码的工作原理,甚至可能是这样的:

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。我发现我可以通过一个更大的功能块来替代5-10个if语句,只需一个try / catch即可,同时使代码更简单和可读。显然,当这是适当的取决于特定的代码,但它绝对值得考虑比通常更频繁。

如果通常的操作是不要用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中检查深层嵌套对象属性的存在是最简单的方法? - 代码日志