在JavaScript中是否有一种(近似)线性的方法来按天对数组中的日期进行分组?
是否有一种有效的解决方案将日期数组分组到按天分组的对象和子数组中 例如:在JavaScript中是否有一种(近似)线性的方法来按天对数组中的日期进行分组?,javascript,complexity-theory,Javascript,Complexity Theory,是否有一种有效的解决方案将日期数组分组到按天分组的对象和子数组中 例如: groupDatesByDay([ new Date('2020-01-01 00:00:00'), new Date('2020-01-01 00:00:01'), new Date('2020-01-02 00:00:00'), new Date('2020-01-02 00:00:01'), new Date('2020-01-03 00:00:00'), new Da
groupDatesByDay([
new Date('2020-01-01 00:00:00'),
new Date('2020-01-01 00:00:01'),
new Date('2020-01-02 00:00:00'),
new Date('2020-01-02 00:00:01'),
new Date('2020-01-03 00:00:00'),
new Date('2020-01-03 00:00:01'),
])
预期的返回值如下所示,其中每天都有一个对象,其中一个键day
表示一天的开始,一个数组包含相应日期的所有日期。
我正在使用Date Fns的startOfDay()
方法
[
{
day: Date Wed Jan 01 2020 00:00:00 GMT+0100 (Central European Standard Time),
times: [
Date Wed Jan 01 2020 00:00:00 GMT+0100 (Central European Standard Time),
Date Wed Jan 01 2020 00:00:01 GMT+0100 (Central European Standard Time),
]
},
{
day: Date Thu Jan 02 2020 00:00:00 GMT+0100 (Central European Standard Time),
times: [
Date Wed Jan 02 2020 00:00:00 GMT+0100 (Central European Standard Time),
Date Wed Jan 02 2020 00:00:01 GMT+0100 (Central European Standard Time),
]
},
{
day: Date Fri Jan 03 2020 00:00:00 GMT+0100 (Central European Standard Time),
times: [
Date Wed Jan 03 2020 00:00:00 GMT+0100 (Central European Standard Time),
Date Wed Jan 03 2020 00:00:01 GMT+0100 (Central European Standard Time),
]
},
]
我写了一个可以工作的函数,但是时间复杂度很差。
这能做得更好吗
groupDatesByDay(日期){
让分组=[]
//将第一个日期推送到分组
推({
日期:开始日期(日期[0]),
时间:[日期[0]]
})
//重复日期
dates.forEach((日期,inx)=>{
如果(inx==0){
返回
}
设为假
for(让i=0;我看选项。我没有使用下划线.js,这就是为什么链接的问题与我的实际问题无关。@j.Doe你问的是“有办法吗”。答案是肯定的,使用标准的分组技术和bucket。你可以自己用映射或对象(只有几行)来实现这一点,或者你可以使用一个实用函数库@PM77-1链接的问题甚至有一个非下划线的答案。@Bergi如果你说有办法,为什么不写一个答案,而不是关闭一个完全相关的问题,这个问题在你链接的问题中没有答案?OP问这是否可能在JavaScript中,而不是在第三方库中罕见。链接问题的非下划线答案令人难以置信地不干净,因为它在分组之前会生成每个日期的字符串。这既不是问题,也不是清洁解决方案所必需的。请参阅以获取选项。我没有使用下划线.js,这就是为什么链接问题与我的实际问题无关。@j.Doe“有办法吗?”答案是肯定的,用bucket使用标准的groupby技术。你可以自己用Map
或object(只有几行)来实现这一点,或者你可以使用一个实用函数库@PM77-1链接的问题甚至有一个非下划线的答案。@Bergi如果你说有办法,为什么不写一个答案,而不是关闭一个完全相关的问题,这个问题在你链接的问题中没有答案?OP问这是否可能在JavaScript中,而不是在第三方库中罕见。链接问题的非下划线答案令人难以置信地不干净,因为它在分组之前会生成每个日期的字符串。这既不是问题,也不是干净解决方案所必需的。
groupDatesByDay(dates) {
let grouped = []
//Push first date to grouped
grouped.push({
day: startOfDay(dates[0]),
times: [dates[0]]
})
//Iterate dates
dates.forEach((date, inx) => {
if (inx == 0) {
return
}
let found = false
for (let i=0; i<grouped.length; i++) {
//Check if grouped contains day of date already
if (grouped[i].day.getTime() == startOfDay(date).getTime()) {
grouped[i].times.push(date)
found = true
break
}
}
if (found) {
return
} else {
grouped.push({
day: startOfDay(date),
times: [date]
})
}
});
return grouped
}