首页 > 解决方案 > 在 JavaScript 中将 JSON 转换为数组/映射

问题描述

我有一个 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
          }
        }
      }

标签: javascriptarraysnode.jsjsonloops

解决方案


好的,我假设您有多个条目,例如您给出的那个条目,并且它们都在一个数组中。所以它会是这样的:

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

推荐阅读