JavaScript获得嵌套属性而不会破坏

时间:2017-07-20 02:47:11

标签: javascript ecmascript-6

我收到一个深层嵌套的对象。我不知道会出现哪些属性。如果我想获得图像,我不能这样做

data.opposite.info.logo.images.s.resized_urls.s,

想象一下,这来自一个用户可以将徽标留空的系统,然后我的代码就会中断。我需要检查这样的属性是否存在?

if(data.opposite){

   if(data.opposite.info)

     if(data.opposite.info.images)

//...etc
}

3 个答案:

答案 0 :(得分:1)

使用javascript' try { ... } catch(e) { ... }阻止。

try { 
  url = data.opposite.info.logo.images.s.resized_urls.s; } 
catch(e) { 
  url =  '' 
}

同样loadash.js有一个get方法,可以帮助您解决这个问题

var url = _.get(data, 'opposite.info.logo.images.s.resized_urls.s', '');

如果路径存在,这将深入到对象并返回'。如果不存在,则返回最后一个参数''在这种情况下。

答案 1 :(得分:0)

我正在尝试通过扫描对象获取价值:jsfiddle

function getObjByProperty(obj, propertyName) {
  if (obj instanceof Object) {
    if (obj.hasOwnProperty(propertyName)) {
        return obj[propertyName];
    }
    for (var val in obj) {
        if (obj.hasOwnProperty(val)) {
            var result = getObjByProperty(obj[val], propertyName);
            if (result != null) {
                return result;
            }
        }
    }
   } else {
    return null;
  }
 }

 var images = getObjByProperty(data, 'images');
 if (images) {      
  console.log(images);
 }

答案 2 :(得分:-2)

您可以编写自己的函数进行测试,但可能是最简单,最干净的方法,就是使用try..catch

try {
    // do ... with data.opposite.info.logo.images.s.resized_urls.s
} catch(e) {
    // do ... if it doesn't exist
}