Получение значения из вложенного JSON

Я пытаюсь проанализировать следующие данные JSON и console.log все время для stop_ids определенного значения. Поэтому, когда я выбираю идентификатор остановки "L26S", консоль регистрирует каждый экземпляр, что время остановки происходит в JSON. Время остановки, которое я хотел бы, указано в trip_update.stop_time_update.arrival.time.low

Я попытался использовать следующий метод безуспешно (feed - это имя моего файла JSON), я считаю, что я на правильном пути с этим, но я не знаю, как продолжить. Любая помощь будет оценена.

var feed = {
  "entity": [{
    "id": "1",
    "is_deleted": false,
    "trip_update": {
      "trip": {
        "trip_id": "009250_L..S",
        "route_id": "L",
        "start_time": null,
        "start_date": "20170512",
        "schedule_relationship": null,
        ".nyct_trip_descriptor": {
          "train_id": "0L 0132+8AV/RPY",
          "is_assigned": true,
          "direction": 3
        }
      },
      "vehicle": null,
      "stop_time_update": [{
          "stop_sequence": null,
          "stop_id": "L26S",
          "arrival": {
            "delay": null,
            "time": {
              "low": 1494569453,
              "high": 0,
              "unsigned": false
            },
            "uncertainty": null
          },
          "departure": {
            "delay": null,
            "time": {
              "low": 1494569483,
              "high": 0,
              "unsigned": false
            },
            "uncertainty": null
          },
          "schedule_relationship": 0,
          ".nyct_stop_time_update": {
            "scheduled_track": "1",
            "actual_track": "1"
          }
        },
        {
          "stop_sequence": null,
          "stop_id": "L27S",
          "arrival": {
            "delay": null,
            "time": {
              "low": 1494569551,
              "high": 0,
              "unsigned": false
            },
            "uncertainty": null
          }
        }
      ]
    }
  }]
}
$.each(feed.entity[0].trip_update.stop_time_update[1], function(i, v) {
  if (v.stop_id == "L02N") {
    console.log(v.arrival.time.low);
    return;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

3 ответа

Решение

Исправлен ваш JSON и код доступа

  1. Вы должны были получить доступ к каждому.stop_time_update
  2. Ваш тест не соответствует ни разу остановок в JSON, который вы дали
  3. Я обернулся в $(function() {}), чтобы можно было определить сущность ниже кода во фрагменте

$(function() {
  $.each(feed.entity[0].trip_update.stop_time_update, function(_, v) {
    if (v.stop_id == "L27S") {
      console.log(v.arrival.time.low);
      return;
    }
  });
});
var feed = {
  "entity": [{
    "id": "1",
    "is_deleted": false,
    "trip_update": {
      "trip": {
        "trip_id": "009250_L..S",
        "route_id": "L",
        "start_time": null,
        "start_date": "20170512",
        "schedule_relationship": null,
        ".nyct_trip_descriptor": {
          "train_id": "0L 0132+8AV/RPY",
          "is_assigned": true,
          "direction": 3
        }
      },
      "vehicle": null,
      "stop_time_update": [{
          "stop_sequence": null,
          "stop_id": "L26S",
          "arrival": {
            "delay": null,
            "time": {
              "low": 1494569453,
              "high": 0,
              "unsigned": false
            },
            "uncertainty": null
          },
          "departure": {
            "delay": null,
            "time": {
              "low": 1494569483,
              "high": 0,
              "unsigned": false
            },
            "uncertainty": null
          },
          "schedule_relationship": 0,
          ".nyct_stop_time_update": {
            "scheduled_track": "1",
            "actual_track": "1"
          }
        },
        {
          "stop_sequence": null,
          "stop_id": "L27S",
          "arrival": {
            "delay": null,
            "time": {
              "low": 1494569551,
              "high": 0,
              "unsigned": false
            },
            "uncertainty": null
          }
        }
      ]
    }
  }]
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ошибка в вашем случае заключается в том, что feed.entity[0].trip_update.stop_time_update это массив, который нужно перебрать (без индекса в конце).

Кроме того, вам не нужен jQuery, используйте нативный js forEach вместо:

feed.entity[0].trip_update.stop_time_update.forEach(function(e){
   if (e.stop_id == "L02N") {
       console.log(v.arrival.time.low);
   }
})

Вы можете создать объект с ключами, равными именам остановок, и значениями, равными временным меткам. Пример:

const a ={"entity":[{"id":"1","is_deleted":false,"trip_update":{"trip":{"trip_id":"009250_L..S","route_id":"L","start_time":null,"start_date":"20170512","schedule_relationship":null,".nyct_trip_descriptor":{"train_id":"0L0132+8AV/RPY","is_assigned":true,"direction":3}},"vehicle":null,"stop_time_update":[{"stop_sequence":null,"stop_id":"L26S","arrival":{"delay":null,"time":{"low":1494569453,"high":0,"unsigned":false},"uncertainty":null},"departure":{"delay":null,"time":{"low":1494569483,"high":0,"unsigned":false},"uncertainty":null},"schedule_relationship":0,".nyct_stop_time_update":{"scheduled_track":"1","actual_track":"1"}},{"stop_sequence":null,"stop_id":"L27S","arrival":{"delay":null,"time":{"low":1494569551,"high":0,"unsigned":false},"uncertainty":null},}]}}]};
                                              
const result = a.entity.reduce((acc, cur, i) => 
  Object.assign(acc, cur.trip_update.stop_time_update && cur.trip_update.stop_time_update.reduce((a, c) => 
    Object.assign(a, {[c.stop_id]: c.arrival.time.low}), {})), {});              

console.log(result)
console.log(result['L26S']) // you can use it like this

Другие вопросы по тегам