检查嵌套对象是否已声明并具有值而无需这么多条件检查

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

我有一个从服务器获取的 JSON 对象。我从中获取值的键看起来像这样:

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

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

所以如果我需要这个名字,我正在做的是:

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

但是即使 store 没有定义,它也不会获得 name 的值(我希望它是 undefined 因为它不存在)并且程序崩溃。所以我现在正在做的是在使用 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 个条件,这当然在性能方面(以及整体编码方面)看起来不是很好。我想知道是否有更简单的方法来做到这一点?

您可以尝试关注

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');
var myJson = null;
try {
    myJson = data.body.region.store.customer.name;
}
catch(err) {
    //display error message
}