在设置变量之前检查项目是否缺失

时间:2017-03-08 14:20:16

标签: javascript jquery

所以,我使用这样的代码:

$.ajax({
    url: 'php/parsedjson.php',
    dataType: 'json',
    success: function(data) {
        $.each(data, function(index, val) {
             var product_name = data[index].Thing[0].Name;
             var pre_date = data[index].Another;
             var hazard_name = data[index].Something[0].Name;
             var remedies = data[index].Here[0].Name;
             var retailers = data[index].Hello[0].Name;
        });
    }
})

这完美地工作并设置所有变量(我然后将它们附加到DOM,但为了简单起见我将其留下了)。

当其中一个对象缺少其中一个项目时,就会出现问题。例如,这将解析通过AJAX提供的5个嵌套JSON对象。其中一个可能缺少data[index].Something[0].Name;。当然,这会阻止each运行并抛出错误。

问题:是否有一条快捷方式可以检查每个项目是否存在而无需对每个项目进行if/else

2 个答案:

答案 0 :(得分:1)

您可能想要使用lodash的_.get函数:https://lodash.com/docs/4.17.4#get

答案 1 :(得分:1)

retoheusser的回答是正确的。但是,除非你已经使用了lodash,否则我认为没有人应该将整个库拉入他们的项目中以使用一个函数,特别是当它很容易编写时。

虽然没有你想要的原生javascript快捷方式,但是编写一个简短的助手可以满足你的需要。

function extract(obj, arry, def) {
  for (key in arry) {
    obj = obj[arry[key]];
    if (obj == null)
      return def || {};
  }
  return obj;
}

鉴于您的代码,您可以像这样使用它。

var product_name = extract(data, [index, 'Thing', 0, 'Name'], '');

我制作了一个快速的代码笔示例http://codepen.io/raykrow/pen/yMgyJq?editors=0012

<强>更新

或者如果你想要一个更有吸引力的方法调用并且不需要传递默认值,你可以使用它。

function extract(obj) {
  for (var i = 1; i < arguments.length; i++) {
    obj = obj[arguments[i]];
    if (obj == null)
      // return whatever best fits you for a
      // default value
      return {};
  }
  return obj;
}

用作:

var product_name = extract(data, index, 'Thing', 0, 'Name');

代码笔示例为http://codepen.io/raykrow/pen/PpWwVE