2017-05-12 53 views
0

我正在構建一個web應用程序,顯示來自某個站點的下一班車。獲取json中的對象的長度

它使用TransportAPI,並從那裏我得到一個JSON文件:https://transportapi.com/v3/uk/bus/stop/450023470/live.json?app_id=221cce2f&app_key=d209929236fc97196775650c2bdb639e&group=route&limit=2&nextbuses=yes

的JSON是一個數組,我有困難訪問的29

{ 
    "atcocode": "450023470", 
    "smscode": "45023470", 
    "request_time": "2017-05-11T11:57:51Z", 
    "name": "Headingley Campus", 
    "stop_name": "Headingley Campus", 
    "bearing": "N", 
    "indicator": "", 
    "locality": "Beckett Park, Leeds", 
    "departures": { 
    "29": [ 
     { 
     "mode": "bus", 
     "line": "29", 
     "line_name": "29", 
     "direction": "Student Village", 
     "operator": "FL", 
     "date": "2017-05-11", 
     "expected_departure_date": "2017-05-11", 
     "aimed_departure_time": "13:05", 
     "expected_departure_time": "13:05", 
     "best_departure_estimate": "13:05", 
     "source": "NextBuses", 
     "dir": "inbound", 
     "id": "https:\/\/transportapi.com\/v3\/uk\/bus\/route\/FL\/29\/inbound\/450023470\/2017-05-11\/13:05\/timetable.json?app_id=221cce2f&app_key=d209929236fc97196775650c2bdb639e", 
     "operator_name": "First Leeds" 
     } 

下面的作品裏面的數據,但我並不總是知道[29]的價值。

alert(obj['departures'][29].length); 

如何在不知道價值的情況下獲得長度?

下面

$.ajax({ 
    type:"GET", 
    dataType: 'JSONP', 
    jsonpCallback: 'callback', 
    url: "https://transportapi.com/v3/uk/bus/stop/450023470/live.json?app_id=221cce2f&app_key=d209929236fc97196775650c2bdb639e&group=route&limit=2&nextbuses=yes", 
    success: function(data) { 
     var obj = jQuery.parseJSON(JSON.stringify(data)); 

alert(obj['departures'][29].length); 

      //$("body").append(JSON.stringify(data['departures'][29][0]['line_name'])); 
      //alert(obj.departures.length); 
     }, 
    error: function(jqXHR, textStatus, errorThrown) { 
      alert(jqXHR.status); 
     }, 

}); 
+0

只是一個命名的事;你沒有得到具有該警報的對象的長度;你會得到一個數組的長度。此外,不知道爲什麼你在做'jQuery.parseJSON(JSON.stringify(data))',當'data'已經是一個對象... –

回答

0

Object.keys(obj.departures)將返回obj.departures鑰匙。根據你的情況,我假設只有一個關鍵字,在你的例子中是「29」。

所以,簡單地用Object.keys(obj.departures)替換「29」:

obj.departures[Object.keys(obj.departures)].length 

請注意,您發佈的代碼展示了一個普通的對象,而不是一個JSON。 JSON是一個對象的字符串表示。

段:

var obj = { 
 
    //... 
 
    "departures": { 
 
    "randomkey": [ 
 
     { 
 
     "mode": "bus", 
 
    //...   
 
     }, 
 
     { 
 
     "mode": "automobile", 
 
    //...   
 
     }, 
 
     { 
 
     "mode": "train" 
 
    //...   
 
     } 
 
    ] 
 
    } 
 
} 
 
console.log(obj.departures[Object.keys(obj.departures)].length); //3

+0

我覺得很奇怪,兩個答案合法地解決了問題, 。如果有任何鼓勵,我會給你一個贊成票,因爲它有效。 – Terry

+0

謝謝,@Terry。這可能是downvote的合理原因,但如果沒有給出解釋,對你(或我)沒有任何幫助。 –

+0

嗨@RickHitchcock,謝謝你。我可能應該添加一個更好的對象,因爲在這個例子中有兩個鍵,29和29x。使用你的例子我怎麼去也得到公交車29x?謝謝 – noddenslehctim

0

完整的代碼只是想迭代對象的屬性:

var obj = JSON.parse(data); // Using native browser JSON parsing instead 

if (obj.hasOwnProperty('departures')) { // Should validate just to be sure 
    for (var i in obj['departures']) { 
     console.log(i, obj['departures'][i], obj['departures'][i].length); // Or anything 
    } 
} 
0

如果你不感興趣的實際鍵的名字,但只是想返回的公交線路作爲一個數組,你可以轉換departures - 物體通過做成陣列

var depArr=Object.values(dataObj.departures); 

然後會給你提供不同公交線路的數量,並且depArr[i].length會給你每條公交線路的次數(i = 0...(n-1))。

0

嘗試Object.keys()Array.map()ES6箭頭指定。

var jsonObj = { 
 
"atcocode": "450023470", 
 
"smscode": "45023470", 
 
"request_time": "2017-05-13T18:42:12+01:00", 
 
"bearing": "N", 
 
"indicator": "", 
 
"name": "Headingley Campus", 
 
"locality": "Beckett Park, Leeds", 
 
"stop_name": "Headingley Campus", 
 
"departures": { 
 
"29": [ 
 
     { 
 
     "mode": "bus", 
 
     "line": "29", 
 
     "line_name": "29", 
 
     "direction": "Student Village", 
 
     "operator": "FL", 
 
     "date": "2017-05-11", 
 
     "expected_departure_date": "2017-05-11", 
 
     "aimed_departure_time": "13:05", 
 
     "expected_departure_time": "13:05", 
 
     "best_departure_estimate": "13:05", 
 
     "source": "NextBuses", 
 
     "dir": "inbound", 
 
     "id": "https:\/\/transportapi.com\/v3\/uk\/bus\/route\/FL\/29\/inbound\/450023470\/2017-05-11\/13:05\/timetable.json?app_id=221cce2f&app_key=d209929236fc97196775650c2bdb639e", 
 
     "operator_name": "First Leeds" 
 
     }] 
 
} 
 
}; 
 

 
var res = Object.keys(jsonObj.departures).map(item => {return jsonObj.departures[item].length}); 
 

 
console.log(res);