繁体   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