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