How can we group hour arrays according to hours.
JavaScript
x
2
1
var hours = ["22:37", "22:52", "23:07", "23:22", "23:37", "23:52", "0:07", "0:22", "0:37", "0:52", "1:07", "1:22", "1:37", "1:52", "2:07", "2:22", "3:07", "3:22", "4:07", "4:22", "4:37", "4:52", "5:07", "5:22", "6:07", "6:22", "7:07", "7:22", "7:37", "7:52", "8:07", "8:22", "8:37", "8:52", "9:07", "9:22", "9:37", "9:52", "10:07", "10:22", "10:37", "10:52", "11:07", "11:22", "11:37", "11:52", "12:07", "12:22", "14:07", "14:52", "15:07", "15:22", "16:07", "16:22", "16:37", "16:52", "17:07", "17:52", "18:07", "18:22", "18:37", "18:52", "19:07", "19:22", "19:37", "19:52", "20:07", "20:22", "20:37", "20:52", "21:07", "21:22", "21:37", "21:52", "22:07", "22:22", "22:37", "22:52", "23:07", "23:22"]
2
As you see, an hour has multiple minute, like 22:37, 22:52
.
I want to create new array like
JavaScript
1
9
1
22: ["22:37", "22:52"],
2
23: [ "23:07", "23:22", "23:37", "23:52"],
3
0 : ["0:07", "0:22", "0:37", "0:52"], // next day
4
5
20: ["20:07", "20:22", "20:37", "20:52"],// next day
6
21: ["21:07", "21:22", "21:37", "21:52"],// next day
7
22: ["22:22", "22:37", "22:52"],
8
23: ["23:07", "23:22"]
9
It contains two days hours.
I tried like this
JavaScript
1
12
12
1
var groupHours = hours.reduce((r, v, i, a) => {
2
v = v.split(':')[0] // getting only hours
3
if (v === a[i - 1]) {
4
r[r.length - 1].push(v);
5
} else {
6
r.push(v === a[i + 1] ? [v] : v);
7
}
8
return r;
9
}, []);
10
11
console.log(groupHours)
12
But it gives me this result
Advertisement
Answer
JavaScript
1
14
14
1
var hours = ["22:37", "22:52", "23:07", "23:22", "23:37", "23:52", "0:07", "0:22", "0:37", "0:52", "1:07", "1:22", "1:37", "1:52", "2:07", "2:22", "3:07", "3:22", "4:07", "4:22", "4:37", "4:52", "5:07", "5:22", "6:07", "6:22", "7:07", "7:22", "7:37", "7:52", "8:07", "8:22", "8:37", "8:52", "9:07", "9:22", "9:37", "9:52", "10:07", "10:22", "10:37", "10:52", "11:07", "11:22", "11:37", "11:52", "12:07", "12:22", "14:07", "14:52", "15:07", "15:22", "16:07", "16:22", "16:37", "16:52", "17:07", "17:52", "18:07", "18:22", "18:37", "18:52", "19:07", "19:22", "19:37", "19:52", "20:07", "20:22", "20:37", "20:52", "21:07", "21:22", "21:37", "21:52", "22:07", "22:22", "22:37", "22:52", "23:07", "23:22"]
2
3
var h = {};
4
5
for (var hh of hours) {
6
try {
7
h[hh.split(':')[0]].push(hh);
8
}
9
catch (e) {
10
h[hh.split(':')[0]] = [hh];
11
}
12
}
13
14
console.log(h);
Update
Solution for several days:
JavaScript
1
23
23
1
var hours = ["22:37", "22:52", "23:07", "23:22", "23:37", "23:52", "0:07", "0:22", "0:37", "0:52", "1:07", "1:22", "1:37", "1:52", "2:07", "2:22", "3:07", "3:22", "4:07", "4:22", "4:37", "4:52", "5:07", "5:22", "6:07", "6:22", "7:07", "7:22", "7:37", "7:52", "8:07", "8:22", "8:37", "8:52", "9:07", "9:22", "9:37", "9:52", "10:07", "10:22", "10:37", "10:52", "11:07", "11:22", "11:37", "11:52", "12:07", "12:22", "14:07", "14:52", "15:07", "15:22", "16:07", "16:22", "16:37", "16:52", "17:07", "17:52", "18:07", "18:22", "18:37", "18:52", "19:07", "19:22", "19:37", "19:52", "20:07", "20:22", "20:37", "20:52", "21:07", "21:22", "21:37", "21:52", "22:07", "22:22", "22:37", "22:52", "23:07", "23:22"]
2
3
4
function split_by_days(hours) {
5
var s = hours.join('#');
6
s.match(/[1-9]:d+#0/g).forEach(t=>s=s.split(t).join(t.replace('#','n')));
7
return s.split('n').map(x => x.split('#'));
8
}
9
10
function day_to_obj(day) {
11
var obj = {};
12
for (var hours of day) {
13
try { obj[hours.split(':')[0]].push(hours) }
14
catch (e) { obj[hours.split(':')[0]] = [hours] }
15
}
16
return obj;
17
}
18
19
var days = split_by_days(hours);
20
21
var array_of_days_objects = days.map(d => day_to_obj(d));
22
23
console.log(array_of_days_objects);