【问题标题】:Check if nested object is declared and has a value without so many conditional checks检查嵌套对象是否已声明并具有没有太多条件检查的值
【发布时间】:2016-01-16 03:57:00
【问题描述】:

我有一个从服务器获取的 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
}

但是说即使 store 没有定义,它也不会得到 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 个条件,这些条件在性能方面(和整体编码方面)当然看起来不太好。我想知道是否有更简单的方法可以做到这一点?

【问题讨论】:

  • 我知道严格来说这不是一个骗局,但我链接的常见问题的解决方案将完全符合您的需求。
  • 如果 lodash 没问题,你可以使用 _.get() var value = _.get(data, "body.region.store.customer.name", undefined /*defaultValue*/)

标签: javascript conditional-statements boolean-logic


【解决方案1】:
var myJson = null;
try {
    myJson = data.body.region.store.customer.name;
}
catch(err) {
    //display error message
}

【讨论】:

    【解决方案2】:

    你可以试试关注

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

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2020-05-12
      • 2014-08-22
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多