检查嵌套对象是否被声明并且具有没有这么多条件检查的值

Check if nested object is declared and has a value without so many conditional checks

本文关键字:检查 条件 有没有 对象 嵌套 是否 声明      更新时间:2023-09-26

我有一个从服务器获得的JSON对象。我从中获取值的密钥如下所示:

var myJson = data.body.region.store.customer.name;

试图在这里获取名称键,但有时 JSON(来自我无法控制的服务)会有一些空字段,例如可能未定义实例名称,因此对象实际上如下所示:data.body.region.store.customer。有时,可能未定义客户、商店或区域(如果数据不存在,则服务不会为值返回 null 或空字符串)。

因此,如果我需要这个名字,我正在做的是这样的:

if(data.body.region.store.customer.name){
   //Do something with the name
}

但是假设即使没有定义商店,它也不会获得 name 的值(我希望它是未定义的,因为它不存在)并且程序崩溃。所以我现在要做的就是在我使用 AND 操作数获取值之前检查 JSON 的每个部分:

if(data && data.body && data.body.region && data.body.region.store && data.body.region.store.customer && data.body.region.store.customer.name){
     //Do something with the name value then
}

这是有效的,因为它按顺序检查,所以它首先检查数据是否存在,如果存在,接下来检查 data.body 是否存在等等。每次都需要检查很多条件,特别是因为我经常使用该服务进行许多其他事情,并且他们也需要自己的条件。因此,要检查名称是否存在,我需要执行 6 个条件,这些条件在性能方面(以及整体编码方面)似乎不是很好。我想知道是否有更简单的方法可以做到这一点?

var myJson = null;
try {
    myJson = data.body.region.store.customer.name;
}
catch(err) {
    //display error message
}

您可以尝试以下

function test(obj, prop) {
    var parts = prop.split('.');
    for(var i = 0, l = parts.length; i < l; i++) {
        var part = parts[i];
        if(obj !== null && typeof obj === "object" && part in obj) {
            obj = obj[part];
        }
        else {
            return false;
        }
    }
    return true;
}
test(myJson, 'data.body.region.store.customer.name');