可以忽略无法读取未定义的属性'0'?

时间:2014-03-03 11:05:50

标签: javascript json

我正在创建一个个人脚本,在某些情况下会收到错误:

Cannot read property '0' of undefined

我有类似的东西

item["OfferSummary"][0]["LowestUsedPrice"][0]["FormattedPrice"]

是否可以完全忽略/覆盖此错误,以便在该场景中只打印n / a或 - ?

4 个答案:

答案 0 :(得分:2)

您可以使用try and catch执行错误处理。

答案 1 :(得分:2)

您可以使用样板函数来执行此操作:

function get(obj, property) {      
  if (Array.isArray(property)) {
    var current = obj;
    for (var i = 0, l = property.length; i < l; ++i) {
      if (Object(current) === current) current = current[property[i]];
      else {
        current = undefined;
        break;
      }
    }
    return current;
  }
  if (Object(obj) === obj) return obj[property];
}

将字符串或数组传递给get以查找属性 - 如果未找到,则会返回undefined

示例:

get(window, ['location', 'href']); // "http://stackoverflow.com..."
get(Number, 'MAX_VALUE'); // 1.7976931348623157e+308

答案 2 :(得分:0)

即使你可以使用try和catch我也不会这样做,我宁愿避免错误,所以你只需要检查你正在阅读的对象:

if(item && item["OfferSummary"].length && item["OfferSummary"][0]["LowestUsedPrice"].length) {
   //then do whatever
}

如果你知道总是被定义,你可以避免在if中检查它。

答案 3 :(得分:0)

与Qantas的答案类似,但在测试中使用。总是希望属性列表是一个数组,我无法看到使用它来获取单个属性的意义,因此对这种情况没有任何让步:

function get2(obj, prop) {

    for (var i=0, iLen=prop.length - 1; i<iLen; i++) {

        if (typeof obj[prop[i]] == 'object') {
            obj = obj[prop[i]];

        } else {
            // Property not found, return undefined (or other suitable value)
            return;
        }
    }
    return obj[prop[i]];
}

var foo = {foo:{bar:{meh:'meh!'}}};
var fum = {meh:'meh!'};
console.log(get2(foo,['foo','bar','meh'])); // meh!
console.log(get2(fum,['meh']));             // meh!
console.log(get2(Number,['MAX_VALUE']));    // 1.7976931348623157e+308
console.log(get2(Object,['prototype','toString'])); // function toString() { ... }

修改

Per Qantas的评论,测试已更新。