Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中将JSON转换为数组/映射_Javascript_Arrays_Node.js_Json_Loops - Fatal编程技术网

在JavaScript中将JSON转换为数组/映射

在JavaScript中将JSON转换为数组/映射,javascript,arrays,node.js,json,loops,Javascript,Arrays,Node.js,Json,Loops,我有一个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"},

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


您可以像这样使用max totalTime获得会话

//创建了2个会话,以不同的totalTime为例 常数数据=[{ 会议:{ 检查点:[{ 状态:已开始, 位置:0, 创建日期:2020-02-20T16:55:37.795Z }, { 状态:暂停, 职位:195, 创建日期:2020-02-20T16:58:53.917Z }, { 状态:已停止, 职位:195, 创建日期:2020-02-20T17:01:04.230Z }, { 状态:已关闭, 职位:195, 创建日期:2020-02-20T17:01:04.250Z } ], 总时间:195 } }, { 会议:{ 检查点:[{ 状态:已开始, 位置:0, 创建日期:2020-02-20T16:55:37.795Z }, { 状态:暂停, 职位:195, 创建日期:2020-02-20T16:58:53.917Z }, { 状态:已停止, 职位:195, 创建日期:2020-02-20T17:01:04.230Z }, { 状态:已关闭, 职位:195, 创建日期:2020-02-20T17:01:04.250Z } ], 总时间:193 } } ] const maxSession=data.sorta,b=>a.totalTime-b.totalTime[0]
log'maxSession',maxSession好的,我假设您有多个条目,就像您作为示例给出的条目一样,它们都在一个数组中。所以它会是这样的:

风险值数据=[ {会话:{检查点:[ {状态:已启动,位置:0,创建日期:2020-02- 20T16:55:37.795Z}, {状态:暂停,位置:195,创建日期:2020-02- 20T16:58:53.917Z}, {状态:停止,位置:195,创建日期:2020-02- 20T17:01:04.230Z}, {状态:关闭,位置:195,创建日期:2020-02- 20T17:01:04.250Z}],总时间:195}, {会话:{检查点:[ {状态:已启动,位置:0,创建日期:2020-02- 20T16:55:37.795Z}, {状态:暂停,位置:195,创建日期:2020-02- 20T16:58:53.917Z}, {状态:停止,位置:195,创建日期:2020-02- 20T17:01:04.230Z}, {状态:关闭,位置:195,创建日期:2020-02- 20T17:01:04.250Z}],总时间:195}, {会话:{检查点:[ {状态:已启动,位置:0,创建日期:2020-02- 20T16:55:37.795Z}, {状态:暂停,位置:195,创建日期:2020-02- 20T16:58:53.917Z}, {状态:停止,位置:195,创建日期:2020-02- 20T17:01:04.230Z}, {状态:关闭,位置:195,创建日期:2020-02- 20T17:01:04.250Z}],总时间:195} ] 如果我是对的,这就是你想要做的:

对阵列进行排序: var sorted=data.sorta,b=>b.session.totalTime-a.session.totalTime

对于每对对象,您将访问要基于其对数组进行排序的值。注意到我在减法中倒了b和a。这是因为您希望将其向下排序,因此较大的值将首先出现

以总时间最大的第一个条目为例: var条目=已排序的[0]

从条目中提取所需的值: var maxTotalTime=entry.session.totalTime; console.logmaxTotalTime

我已经展示了上面的步骤,因为您要求获得最佳解决方案,但下面是如何更正您试图使用的代码:

  let maxValue = 0
  let data = JSON.parse(audios).data
  for (let entry of data) {
      let value = entry.session.totalTime;
      if (value > maxValue) {
        maxValue = value;
      }
  }

var timeArray=[];data.forEachitem=>emptyArray.pushitem.totalTime.parseInt;console.logtimeArray.max 100%确定它可以小于这个使用过滤器,但我太懒了,无法解决两个问题:1.为什么你尝试的东西没有奏效?;2您的条目的格式如何?如图所示,它看起来像一个对象的字段。因此,每个条目都在同一对象的字段中,或者每个条目都在自己的对象中,每个条目都有字段“audio”?.console.log JSON.parseaudios.data.mapx=>+x.totalTime.filterx=>!x、 reduceAc,x=>Math.maxacc,x@KevinHernandez 100%确定item.totalTime.parseInt将抛出未捕获的类型错误:item.totalTime.parseInt不是function@user120242对于这两个问题,我试图为自己解开一个谜团,至少是:OP的初始数据格式到底是怎样的?他们的示例对我来说并不清楚,因为实际上有一个条目数据可以与他们的代码一起工作的情况。这将是{time1:2000,time2:3200,time3:2800},这是不可能的,但可能的。由于他们的输入示例和代码不匹配,我想知道他们到底在哪里搞混了。我怎么能只得到totalTime值呢?totalTime是session的一个属性,所以我想您需要的是const maxSession=data.sorta,b=>a.session.totalTime-b.session.totalTime[0].session.totaltime谢谢你现在更有意义了!但是我的原版有什么问题 nal实现?您正在用于。。。在里面但你真的想要。。。属于for…in用于循环遍历对象的属性,而for…of用于迭代遍历迭代器的元素。数组是最常见的迭代器类型,但也有其他类型。