Преобразовать JSON в массив / карту в JavaScript - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть JSON ответ, который состоит из времени, когда пользователь воспроизводит аудиофайл. Для каждого аудио сеанса у меня есть:

   {"session": {"checkpoints": [
   {"status": "started", "position": 0, "createdAt": "2020-02- 
   20T16:55:37.795Z"}, 
   {"status": "paused", "position": 195, "createdAt": "2020-02- 
   20T16:58:53.917Z"}, 
   {"status": "stopped", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.230Z"},
   {"status": "closed", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.250Z"}], "totalTime": 195}}

Я хочу отобразить все значения totalTime и найти максимальное значение. Каков наилучший способ сделать это? то, что я сделал изначально:

      let maxValue = 0
      let data = JSON.parse(audios).data
      for (let totalTime in data) {
        if (data.hasOwnProperty(totalTime)) {
          let value = data[totalTime]
          if (value > maxValue) {
            maxValue = value
          }
        }
      }

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

Если данные являются массивом, вы можете отсортировать их от меньшего к большему по totalTime и взять последний элемент, подобный этому

  let data = JSON.parse(audios).data;
  data.sort((a,b) => a.totalTime - b.totalTime);
  a[a.length - 1] - is what we need now
0 голосов
/ 20 апреля 2020

Хорошо, я предполагаю, что у вас есть несколько записей, подобных той, что вы дали в качестве примера, и все они находятся в массиве. Так что это будет что-то вроде:

var data = [
{"session": {"checkpoints": [
   {"status": "started", "position": 0, "createdAt": "2020-02- 
   20T16:55:37.795Z"}, 
   {"status": "paused", "position": 195, "createdAt": "2020-02- 
   20T16:58:53.917Z"}, 
   {"status": "stopped", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.230Z"},
   {"status": "closed", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.250Z"}], "totalTime": 195}},
{"session": {"checkpoints": [
   {"status": "started", "position": 0, "createdAt": "2020-02- 
   20T16:55:37.795Z"}, 
   {"status": "paused", "position": 195, "createdAt": "2020-02- 
   20T16:58:53.917Z"}, 
   {"status": "stopped", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.230Z"},
   {"status": "closed", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.250Z"}], "totalTime": 195}},
{"session": {"checkpoints": [
   {"status": "started", "position": 0, "createdAt": "2020-02- 
   20T16:55:37.795Z"}, 
   {"status": "paused", "position": 195, "createdAt": "2020-02- 
   20T16:58:53.917Z"}, 
   {"status": "stopped", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.230Z"},
   {"status": "closed", "position": 195, "createdAt": "2020-02- 
   20T17:01:04.250Z"}], "totalTime": 195}}
]

Если я прав, вот что вы хотите сделать:

  1. Сортировать ваш массив:

var sorted = data.sort((a, b) => b.session.totalTime - a.session.totalTime);

Для каждой пары объектов вы получите доступ к значению, на основе которого вы хотите отсортировать массив. Заметил, что я перевернул b и a в вычитании. Это потому, что вы хотите отсортировать его по убыванию, поэтому на первом месте будет большее значение.

Возьмите первую запись, которая будет иметь наибольшее время:

var entry = sorted[0];

Извлеките желаемое значение из записи:

var maxTotalTime = entry.session.totalTime; console.log(maxTotalTime);


Я показал шаги выше, потому что вы запросили лучшее решение, но вот как вы можете исправить код, с которым пытались работать:

  let maxValue = 0
  let data = JSON.parse(audios).data
  for (let entry of data) {
      let value = entry.session.totalTime;
      if (value > maxValue) {
        maxValue = value;
      }
  }
0 голосов
/ 20 апреля 2020

Вы можете получить сеанс с макс. totalTime вот так

// created 2 sessions, with different totalTime as example
const data = [{
    "session": {
      "checkpoints": [{
          "status": "started",
          "position": 0,
          "createdAt": "2020-02-20T16:55:37.795Z"
        },
        {
          "status": "paused",
          "position": 195,
          "createdAt": "2020-02-20T16:58:53.917Z"
        },
        {
          "status": "stopped",
          "position": 195,
          "createdAt": "2020-02-20T17:01:04.230Z"
        },
        {
          "status": "closed",
          "position": 195,
          "createdAt": "2020-02-20T17:01:04.250Z"
        }
      ],
      "totalTime": 195
    }
  },
  {
    "session": {
      "checkpoints": [{
          "status": "started",
          "position": 0,
          "createdAt": "2020-02-20T16:55:37.795Z"
        },
        {
          "status": "paused",
          "position": 195,
          "createdAt": "2020-02-20T16:58:53.917Z"
        },
        {
          "status": "stopped",
          "position": 195,
          "createdAt": "2020-02-20T17:01:04.230Z"
        },
        {
          "status": "closed",
          "position": 195,
          "createdAt": "2020-02-20T17:01:04.250Z"
        }
      ],
      "totalTime": 193
    }
  }
]

const maxSession = data.sort((a, b) => a.totalTime - b.totalTime)[0]
console.log('maxSession', maxSession)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...