[英]Grouping a javascript array by time difference
var Player = [
{
name: "John",
Events: {
timeList: ["7:00 AM", "9:00 AM", "12:01 PM", "2:00 PM"]
},
groups: {}
},
{
name: "Doe",
Events: {
timeList: ["7:00 AM", "8:00 AM", "10:00 AM", "12:01 PM"]
},
groups: {}
}
];
我试图遍历每个玩家的timeList数组,并将该数组中的每个项目按小于2小时的时间差进行分组。
我尝试遍历数组中的每个元素并编写一个if条件,以查看哪些元素匹配。 但是,我无法将分组的元素推入单独的数组中。
Player = [
{
name: "John",
Events: {
timeList: ["7:00 AM", "9:00 AM", "12:01 PM", "2:00 PM"]
},
groups: {0: ["7:00 AM", "9:00 AM"], 1: ["12:01 PM", "2:00 PM"]}
},
{
name: "Doe",
Events: {
timeList: ["7:00 AM", "8:00 AM", "9:00 AM", "12:01 PM"]
},
groups: {0: ["7:00 AM", "8:00 AM", "9:00 AM"], 1: ["12:01 PM"]}
}
];
如果需要,可以更改对象的结构。
提前一吨。
编写一个函数来标准化您的时间,编写一个函数来比较时间与上一次给出的时间(初始条件为-Infinity
),循环遍历您的Arrays 。
function timeInMin(str) {
str = str.split(/[: ]/);
if (str[0] === '12') {
if (str[2] === 'AM') {
str[1] = 0;
}
} else if (str[2] === 'PM') {
str[0] = (+str[0]) + 12;
}
return 60 * (+str[0]) + (+str[1]);
}
function groupFactory(groups) {
var i = -1, last = -Infinity;
groups = groups || {};
return function addToGroup(time) {
var mins = timeInMin(time);
if (mins - last <= 2 * 60) {
groups[i].push(time);
} else {
++i;
groups[i] = [time];
}
last = mins;
return groups;
};
}
var i, j, gf;
for (i = 0; i < Player.length; ++i) {
gf = groupFactory(Player[i].groups);
for (j = 0; j < Player[i].Events.timeList.length; ++j) {
gf(Player[i].Events.timeList[j]);
}
}
结果是
[
{
"name": "John",
"Events": {
"timeList": ["7:00 AM", "9:00 AM", "12:01 PM", "2:00 PM"]
},
"groups": {
"0": ["7:00 AM", "9:00 AM"],
"1": ["12:01 PM","2:00 PM"]
}
},
{
"name": "Doe",
"Events": {
"timeList": ["7:00 AM", "8:00 AM", "10:00 AM", "12:01 PM"]
},
"groups": {
"0": ["7:00 AM", "8:00 AM", "10:00 AM"],
"1": ["12:01 PM"]
}
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.