簡體   English   中英

將 JSON 轉換為 JavaScript 中的數組/映射

[英]Convert JSON to an array/map in JavaScript

我有一個 JSON 響應,其中包含用戶播放音頻文件的時間。 對於每個音頻 session 我有:

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

我想 map 所有的 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
          }
        }
      }

您可以像這樣獲得最大總時間的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)

好的,我假設您有多個條目,例如您給出的那個條目,並且它們都在一個數組中。 所以它會是這樣的:

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

對於每對對象,您將訪問要根據其對數組進行排序的值。 注意到我在減法中倒轉了ba 那是因為您想將其向下排序,因此較大的值將首先出現。

  1. 取第一個條目,這將是總時間最大的條目:

var entry = sorted[0];

  1. 從條目中提取所需的值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM