JavaScript,检查嵌套对象属性是否为空/未定义的优雅方法

2022-08-30 04:37:46

我不时遇到的一个“问题”是我有一个对象,例如 通过使用应用程序的过程,这被填充。让我们说 somwhere,在 AJAX 调用或我这样做之后:user = {}

user.loc = {
    lat: 50,
    long: 9
}

在另一个地方,我想检查是否存在。user.loc.lat

if (user.loc.lat) {
    // do something
}

如果它不存在,这将导致错误。如果 是 ,当然也是。user.loc.latundefineduser.locundefined

"Cannot read property 'lat' of null" - Dev Tools error

这意味着我需要像这样检查它:

if (user.loc) {
    if (user.loc.lat) {
        // do something
    }
}

if (user.loc && user.loc.lat) {
    // do something
}

这并不漂亮,我的对象越大,它就越糟糕 - 显然(想象一下10级嵌套)。这让我很生气,如果也是,那不仅仅是回来。if(user.loc.lat)falseuser.locundefined

检查此类情况的理想方法是什么?


答案 1

您可以使用如下实用程序函数:

get = function(obj, key) {
    return key.split(".").reduce(function(o, x) {
        return (typeof o == "undefined" || o === null) ? o : o[x];
    }, obj);
}

用法:

 get(user, 'loc.lat')     // 50
 get(user, 'loc.foo.bar') // undefined

或者,仅检查属性是否存在,而不获取其值:

has = function(obj, key) {
    return key.split(".").every(function(x) {
        if(typeof obj != "object" || obj === null || ! x in obj)
            return false;
        obj = obj[x];
        return true;
    });
}

if(has(user, 'loc.lat')) ...

答案 2

您可以使用懒惰组合检查:and

if(user.loc && user.loc.lat) { ...

或者,您使用 CoffeeScript。ES2020有新的语法( Nullish合并运算符 )。

user.loc?.lat?. '...'

这将运行对属性的检查并防止空对象。loc