javascript - JSON 对象数组。按名称对对象值进行分组
问题描述
我正在尝试根据包含对象的数组中的名称关键字对 Javascript JSON 对象值进行分组,这是一个动态数组,因此不能硬编码。
对象中有时间值
time_entries 数组长度发生变化。
time_entries 数组中可以包含 1 个或多个对象。
我想按时间对对象进行分组:小时分钟秒
{
"activities": [
{
"name": "player one",
"time_entries": [
{
"days": 0,
"end_time": "2019-09-30 15:19:43",
"hours": 01,
"minutes": 02,
"seconds": 11,
"start_time": "2019-09-30 14:17:58"
},
{
"days": 0,
"end_time": "2019-09-25 15:40:11",
"hours": 0,
"minutes": 20,
"seconds": 4,
"start_time": "2019-09-25 15:20:15"
},
{
"days": 0,
"end_time": "2019-09-25 16:10:15",
"hours": 0,
"minutes": 30,
"seconds": 4,
"start_time": "2019-09-25 15:40:11"
},
#there can be more objects here
]
},
{
"name": "player two",
"time_entries": [
{
"days": 0,
"end_time": "2019-09-30 19:18:51",
"hours": 0,
"minutes": 0,
"seconds": 52,
"start_time": "2019-09-30 19:17:58"
},
#there can be more objects here
]
},
{
"name": "player three",
"time_entries": [
{
"days": 0,
"end_time": "2019-09-30 19:19:09",
"hours": 0,
"minutes": 0,
"seconds": 58,
"start_time": "2019-09-30 19:18:51"
},
{
"days": 0,
"end_time": "2019-09-30 21:21:09",
"hours": 2,
"minutes": 1,
"seconds": 0,
"start_time": "2019-09-30 19:20:09"
},
#there can be more objects here
]
}
]
}
我想得到的是这样的
[
{
"name": "player one",
"time_entries": [
{
"days": 0,
"end_time": "2019-09-25 16:10:15",
"hours": 01,
"minutes": 50,
"seconds": 19,
"start_time": "2019-09-30 14:17:58"
}
]
},
{
"name": "player two",
"time_entries": [
{
"days": 0,
"end_time": "2019-09-30 19:18:51",
"hours": 0,
"minutes": 0,
"seconds": 52,
"start_time": "2019-09-30 19:17:58"
}
]
},
{
"name": "player three",
"time_entries": [
{
"days": 0,
"end_time":"2019-09-30 21:21:09",
"hours": 2,
"minutes": 1,
"seconds": 58,
"start_time": "2019-09-30 19:18:51"
}
]
}
]
解决方案
你可以这样做:
- 使用map()方法迭代给定的活动并转换每个活动的
time_entries
属性。 getTimeEntry()
方法采用时间条目数组并返回最早开始时间、最晚结束时间和转换为的总活动时间days, hours, minutes, seconds
。
let data = { "activities": [ { "name": "player one", "time_entries": [ { "days": 0, "end_time": "2019-09-30 15:19:43", "hours": 01, "minutes": 02, "seconds": 11, "start_time": "2019-09-30 14:17:58" }, { "days": 0, "end_time": "2019-09-25 15:40:11", "hours": 0, "minutes": 20, "seconds": 4, "start_time": "2019-09-25 15:20:15" }, { "days": 0, "end_time": "2019-09-25 16:10:15", "hours": 0, "minutes": 30, "seconds": 4, "start_time": "2019-09-25 15:40:11" } ] }, { "name": "player two", "time_entries": [ { "days": 0, "end_time": "2019-09-30 19:18:51", "hours": 0, "minutes": 0, "seconds": 52, "start_time": "2019-09-30 19:17:58" } ] }, { "name": "player three", "time_entries": [ { "days": 0, "end_time": "2019-09-30 19:19:09", "hours": 0, "minutes": 0, "seconds": 58, "start_time": "2019-09-30 19:18:51" }, { "days": 0, "end_time": "2019-09-30 21:21:09", "hours": 2, "minutes": 1, "seconds": 0, "start_time": "2019-09-30 19:20:09" } ] } ] };
let result = {};
result.activities = data.activities.map(item => {
return {
"name": item.name,
"time_entries": [getTimeEntry(item.time_entries)]
};
});
function getTimeEntry(timeEntries) {
let earliestTime = timeEntries[0].start_time;
let latestTime = timeEntries[0].end_time;
// Find earliest start time and latest end time.
timeEntries.forEach(entry => {
if (new Date(entry.start_time) < new Date(earliestTime)) {
earliestTime = entry.start_time;
}
if (new Date(entry.end_time) > new Date(latestTime)) {
latestTime = entry.end_time;
}
});
// Calculate total seconds.
let seconds = timeEntries.reduce((totalSeconds, currentEntry) => {
let seconds = 0;
seconds += currentEntry.seconds;
seconds += currentEntry.minutes * 60;
seconds += currentEntry.hours * 60 * 60;
seconds += currentEntry.days * 24 * 60 * 60;
return totalSeconds + seconds;
}, 0);
// Convert total seconds to days, hours, minutes, and seconds.
let days = Math.floor(seconds / (24 * 60 * 60));
seconds = seconds % (24 * 60 * 60);
let hours = Math.floor(seconds / (60 * 60));
seconds = seconds % (60 * 60);
let minutes = Math.floor(seconds / 60);
seconds = seconds % 60;
return {
"start_time": earliestTime,
"end_time": latestTime,
"days": days,
"hours": hours,
"minutes": minutes,
"seconds": seconds
};
}
console.log(result);
推荐阅读
- vhdl - VHDL 循环 - 仅完成最后一个增量
- python - Python Web Scraping (edX)
- css - CSS - 如何在移除时反转动画
- django - Django 模板:如何拆分 SplitDateTimeWidget?
- php - 使用 AJAX 将文本从文本框发送到 PHP
- html - Html 文件不读取外部 js 文件
- powershell - PowerShell/Batch 脚本重命名每个文件以包含原始名称 + 文件夹名称
- ffmpeg - 如何设置使用 ffmpeg 生成管道 mp4 的总文件持续时间?
- ef-core-2.0 - Asp.Net Boilerplate InsertAsync 方法不起作用并返回负 id
- python-3.x - Django 我想减去两个日期,比如 start_date - end_date,只需要几天