javascript - 在 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
}
}
}
解决方案
好的,我假设您有多个条目,例如您给出的那个条目,并且它们都在一个数组中。所以它会是这样的:
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}}
]
如果我是正确的,这就是你想要做的:
- 对数组进行排序:
var sorted = data.sort((a, b) => b.session.totalTime - a.session.totalTime);
对于每对对象,您将访问要根据其对数组进行排序的值。注意到我已经倒置b
并a
在减法中。那是因为您想将其向下排序,因此较大的值将首先出现。
- 取第一个条目,这将是总时间最大的条目:
var entry = sorted[0];
- 从条目中提取所需的值:
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;
}
}
推荐阅读
- abap - 如何在abap客户报告中使用ME_UPDATE_INFORECORD的变更文件
- flutter - 如何覆盖 Flutter 中的 Checkbox 小部件类?
- c# - 如何使 DateTime 绑定到 RazorPages ViewModel?
- excel - 如何在 excel 宏中编码以将数据作为数据行提取到新工作表(新格式)
- javascript - JavaScript - 超出最大调用堆栈大小
- python - 为什么在不同线程中调用 asyncio subprocess.communicate 会挂起?
- javascript - 循环通过js中的计算器按钮
- javascript - 使用 facebook 分享动态更新元标记 - Angular 6
- reactjs - React redux 异步动作创建者测试
- azure-devops - VS 测试运行多次而不是一次