2017-09-25 58 views
0

對不起,這個愚蠢的問題,但對我的生活,我不能得到這個權利和一點點noob。即時得到一個前端JavaScript錯誤:未定義的數組長度檢查

類型錯誤:無法讀取的特性 '數據' 未定義

我的代碼:

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

使用你的調試器來找出爲什麼它是'undefined'和你實際上在找什麼。 – SLaks

+1

我的猜測是'data'可能是一個String – CollinD

+0

由於錯誤提示「無法讀取屬性'數據'的未定義,您需要檢查」.data「,您需要檢查此屬性的父對象。似乎你無法得到data.response [0],可能問題出在你的「數據」參數上,不知何故,成功回調不能獲得數據參數的值。 –

回答

1

首先要做的第一件事,確保你是e接收您期望的響應類型!

之後,在可能未定義的嵌套屬性看時,你可以做一對夫婦的事情,但最容易讓大多數人理解的是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,有香草JS版本:

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; 
} 

該函數將接受任何處於Object相關prop,包括數組數索引。