【问题标题】:Convert JSON to an array/map in JavaScript在 JavaScript 中将 JSON 转换为数组/映射
【发布时间】:2020-08-03 07:04:18
【问题描述】:

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

【问题讨论】:

  • var timeArray = []; data.forEach(item => emptyArray.push(item.totalTime.parseInt())); console.log(timeArray.max) 100% 肯定它可以比这个使用过滤器更小,但我懒得想出一个大声笑
  • 两个问题:1)为什么你尝试的没有奏效? 2)您的条目格式如何? (正如您在那里展示的那样,它看起来像是一个对象的一个​​字段。所以每个条目都在同一个对象的一个​​字段中,或者每个条目都在它自己的对象中,每个条目都有“音频”字段?)。跨度>
  • console.log( JSON.parse(audios).data.map(x=>+x.totalTime).filter(x=>!x).reduce((acc,x)=>Math.max(acc,x)) )
  • @KevinHernandez 100% 肯定item.totalTime.parseInt() 会抛出Uncaught TypeError: item.totalTime.parseInt is not a function
  • @user120242 这两个问题我都在尝试解决同一个谜团(至少对我而言):OP 的初始数据究竟是如何格式化的?他们的例子对我来说不是很清楚,因为实际上有一个条目数据可以与他们的代码一起使用。那将是{ time1: 2000, time2: 3200, time3: 2800 },这不太可能,但可能。由于他们的入口示例和他们的代码不匹配,我想知道他们到底是在哪里弄糊涂了。

标签: javascript arrays node.js json loops


【解决方案1】:

您可以像这样获得与 max 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)

【讨论】:

  • 我怎样才能仅获得 totalTime 值?
  • totalTimesession 的属性,所以我想你想要的是const maxSession = data.sort((a, b) => a.session.totalTime - b.session.totalTime)[0].session.totalTime
  • 谢谢你现在更有意义了!但我原来的实现有什么问题?
  • 你正在使用for ( ... in ... ),但你真的想要for ( ... of ... )for...in 用于循环遍历对象的属性,而for...of 用于遍历迭代器的元素。 (数组是最常见的迭代器类型,但还有其他类型。)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多