检查是否声明了嵌套对象,并且没有那么多条件检查的值

时间:2016-01-15 19:48:21

标签: javascript conditional-statements boolean-logic

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

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

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

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

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
}

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

您可以尝试以下

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');