Javascript 如何在功能上将单个时间戳聚合到时间范围中

Javascript 如何在功能上将单个时间戳聚合到时间范围中,javascript,dictionary,filter,functional-programming,reduce,Javascript,Dictionary,Filter,Functional Programming,Reduce,抱歉,如果你能想出一个更好的标题,请编辑 我最近开始尝试在JavaScript中使用更多的map/filter/reduce操作,我有一个问题要解决,我想知道实现这一点的最佳函数方法 我有一个数据库的行列表,其中有一个“time”列 {[x, y, 15:10, z], [x, y, 15:20, z], [x, y, 16:10, z]} 我想获取这个数据集,并写出一个不同的数据集,如下所示: [{timebox: "15:00-16:00", count: 2}, {timebox: "1

抱歉,如果你能想出一个更好的标题,请编辑

我最近开始尝试在JavaScript中使用更多的map/filter/reduce操作,我有一个问题要解决,我想知道实现这一点的最佳函数方法

我有一个数据库的行列表,其中有一个“time”列

{[x, y, 15:10, z], [x, y, 15:20, z], [x, y, 16:10, z]}
我想获取这个数据集,并写出一个不同的数据集,如下所示:

[{timebox: "15:00-16:00", count: 2}, {timebox: "16:00-17:00", count: 1}]

我可以想出一些方法来实现这一点,包括几个操作(比如每个“时间框”只写几个过滤语句),但是我想问的是,有没有一种干净、简单的方法来实现这一点

您可以使用类似下划线的
countBy
()

在这里,
getInterval
应该返回指定时间值的时间间隔(例如,您可以使用
Math.floor
实现它)。 它将生成如下对象:

{
    "15:00-16:00": 2,
    "16:00-17:00": 1
}

从这里开始,转换为数组应该很简单

您可以使用类似下划线的
countBy
()

在这里,
getInterval
应该返回指定时间值的时间间隔(例如,您可以使用
Math.floor
实现它)。 它将生成如下对象:

{
    "15:00-16:00": 2,
    "16:00-17:00": 1
}

从这里开始,转换为数组应该很简单

对于散列对象,可以分割时间,只取小时部分

函数getTimebox(t){ 返回[t,(+t+1)%24].map(v=>('00'+v).slice(-2)+':00').join('-'); } 变量数组=['x','y','15:10','z'],['x','y','15:20','z'],['x','y','16:10','z'],['x','y','23:23','z'], 结果=数组.reduce(函数(散列){ 返回函数(r,a){ var timebox=a[2]。拆分(“:”)[0]; 如果(!哈希[时间框]){ 哈希[timebox]={timebox:getTimebox(timebox),计数:0}; r、 推送(哈希[时间框]); } 哈希[timebox]。计数++; 返回r; }; }(Object.create(null)),[]); 控制台日志(结果)
.as console wrapper{max height:100%!important;top:0;}
对于散列对象,您可以分割时间,只取小时部分

函数getTimebox(t){ 返回[t,(+t+1)%24].map(v=>('00'+v).slice(-2)+':00').join('-'); } 变量数组=['x','y','15:10','z'],['x','y','15:20','z'],['x','y','16:10','z'],['x','y','23:23','z'], 结果=数组.reduce(函数(散列){ 返回函数(r,a){ var timebox=a[2]。拆分(“:”)[0]; 如果(!哈希[时间框]){ 哈希[timebox]={timebox:getTimebox(timebox),计数:0}; r、 推送(哈希[时间框]); } 哈希[timebox]。计数++; 返回r; }; }(Object.create(null)),[]); 控制台日志(结果)
。作为控制台包装{max height:100%!important;top:0;}
您可以执行以下操作:

var行=[
[x',y',15:10',z'],
[x',y',15:20',z'],
[x',y',16:10',z']
];
var集合=行。减少(函数(集合,行){
var currTime=+行[2]。拆分(':')[0]+(+行[2]。拆分(':')[1])/24;
var key=Math.floor(currTime)+'-'+Math.ceil(currTime);
设置[键]=设置[键]| |[];
设置[键]。按(行);
返回集;
}, {});
var result=Object.keys(set).map(function(key){
返回{
“timebox”:键,
“计数”:设置[key]。长度
}
});

控制台日志(结果)您可以执行以下操作:

var行=[
[x',y',15:10',z'],
[x',y',15:20',z'],
[x',y',16:10',z']
];
var集合=行。减少(函数(集合,行){
var currTime=+行[2]。拆分(':')[0]+(+行[2]。拆分(':')[1])/24;
var key=Math.floor(currTime)+'-'+Math.ceil(currTime);
设置[键]=设置[键]| |[];
设置[键]。按(行);
返回集;
}, {});
var result=Object.keys(set).map(function(key){
返回{
“timebox”:键,
“计数”:设置[key]。长度
}
});

控制台日志(结果)使用reduce和filter的实现。不使用哈希或映射类型对象,因此在线性时间内完成对聚合数组的查找

var x=[[“x”、“y”、“15:10”、“z”]、[“x”、“y”、“15:20”、“z”]、[“x”、“y”、“16:10”、“z”];
变量y=x.reduce(函数(e,i){
如果(e.filter((n)=>n.timebox==i[2]。拆分(“:”)[0]+”:00“+”-“+(parseInt(i[2]。拆分(“:”)[0])+1)+”:00”)。长度==0)
e、 推送({timebox:i[2]。拆分(':')[0]+“:00”+“-”+(parseInt(i[2]。拆分(':')[0])+1)+“:00”,计数:0});
e、 筛选器((n)=>n.timebox==i[2]。拆分(':')[0]+“:00”+“-”+(parseInt(i[2]。拆分(':')[0])+1)+“:00”)[0]。计数+=1;
返回e;
}
,
[]);

警报(JSON.stringify(y))使用reduce和filter的实现。不使用哈希或映射类型对象,因此在线性时间内完成对聚合数组的查找

var x=[[“x”、“y”、“15:10”、“z”]、[“x”、“y”、“15:20”、“z”]、[“x”、“y”、“16:10”、“z”];
变量y=x.reduce(函数(e,i){
如果(e.filter((n)=>n.timebox==i[2]。拆分(“:”)[0]+”:00“+”-“+(parseInt(i[2]。拆分(“:”)[0])+1)+”:00”)。长度==0)
e、 推送({timebox:i[2]。拆分(':')[0]+“:00”+“-”+(parseInt(i[2]。拆分(':')[0])+1)+“:00”,计数:0});
e、 筛选器((n)=>n.timebox==i[2]。拆分(':')[0]+“:00”+“-”+(parseInt(i[2]。拆分(':')[0])+1)+“:00”)[0]。计数+=1;
返回e;
}
,
[]);

警报(JSON.stringify(y))我不得不更改currTime变量,因为它导致了一些奇怪的行为-但由于目前我总是使用1小时的时间框,所以实际上关键点可能只是一小时的地板。我选择了'var currTime=row[“time”].split(':')[0];'变量键=当前时间+“:00”;”不过效果很好,谢谢@有抱负的专家很高兴我能帮上忙。:)我还是忍不住