【问题标题】:Get the length of object in json获取json中对象的长度
【发布时间】:2017-05-12 15:21:27
【问题描述】:

我正在构建一个 Web 应用程序,用于显示某个站点的下一班车。

它使用 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);
        },

});

【问题讨论】:

  • 只是一个命名的东西;您没有通过该警报获得对象的长度;你得到一个数组的长度。另外,当data 已经是一个对象时,不确定你为什么要这样做jQuery.parseJSON(JSON.stringify(data))...

标签: jquery arrays json ajax object


【解决方案1】:

Object.keys(obj.departures) 将返回 obj.departures 的密钥。根据您的上下文,我假设只有一个键,在您的示例中是“29”。

所以只需将“29”替换为Object.keys(obj.departures)

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

【讨论】:

  • 我觉得奇怪的是,两个合法解决问题的答案都被否决了。如果它有任何鼓励,我给你一个赞成票,因为它有效。
  • 谢谢,@Terry。投反对票可能有正当的理由,但如果没有给出任何解释,这对你(或我)没有任何帮助。
  • 嗨@RickHitchcock,谢谢。我可能应该为我的对象添加一个更好的 sn-p,因为在这个例子中有 2 个键,29 和 29x。使用您的示例,我将如何获得 29x 的公共汽车?谢谢
  • 如果总是有2个key,第二个key等于第一个加上字母“x”,你可以像这样得到第二个:obj.departures[Object.keys(obj.departures) + 'x'].length。否则,其他发布的答案之一可能更适合您。
【解决方案2】:

只需迭代对象的属性:

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

【讨论】:

    【解决方案3】:

    如果您对实际的键名不感兴趣,而只想将返回的总线线路作为数组获取,您可以将 departures-object 转换为数组

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

    var n=depArr.length 将为您提供所提供的不同公交线路的数量,depArr[i].length 将为您提供每条公交线路的次数 (i = 0...(n-1))。

    【讨论】:

      【解决方案4】:

      尝试 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);

      【讨论】:

        猜你喜欢
        • 2014-04-30
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 2019-09-22
        • 2018-07-19
        • 1970-01-01
        • 2013-12-19
        相关资源
        最近更新 更多