未定义的数组长度检查

时间:2017-09-25 18:59:54

标签: javascript

抱歉这个愚蠢的问题,但对于我的生活,我无法得到正确的和一点菜鸟。我得到一个前端javascript错误:

TypeError:无法读取属性'数据'未定义的

我的代码:

var getApiPipe = services.pipecall(_this.getPackage).success(function (data) {
                if (data.response[0].data.length > 0) {
                    _this.buyerObjectResponse = data.response[0].data;
                } else {
                    _this.noDataBuyer = true;
                }
                _thisRoot.loading = false;
            });

从服务器返回的JSON返回:

{
   "status":true,
   "response":[
      {
         "data":[
            {
               "ID":1,
               "auctionid":4,
               "sessionname":"Session 1",
               "created":"2017-09-25 10:13:57"
            }
         ]
      }
   ]
}

请帮助:(

1 个答案:

答案 0 :(得分:1)

首先,请确保您已收到您期望的回复类型!

之后,当查看可能未定义的嵌套属性时,您可以做一些事情,但大多数人最容易理解的是Duck Casing

if(
  data &&
  data.response &&
  data.response.length &&
  data.response[0].data &&
  data.response[0].data.length
) {
  //do positive match here
} else {
  //no data
}

通过检查什么是积极匹配的每一部分,你可以确保只有每一件都在那里才会前进。

稍微慢一些,更通用的可能性就是使用像你这样的path函数在许多库中找到。 Ramda有很好的实现,但如果你不想使用Ramda,那就有一个vanilla版本:

function path ( paths, object ) { // will traverse the path, and if prop is found, returns it.
  for(var i = 0, l = paths.length, intermediate = true; i < l && intermediate; i++){
    intermediate = object[paths[i]];
  }
  return intermediate !== undefined? intermediate : null;
}

此函数将接受prop中任何相关Object的内容,包括数组索引的数字。