如何在Javascript中按15分钟的间隔对json集合进行分组
假设我们在Javascript中有这样一个集合:如何在Javascript中按15分钟的间隔对json集合进行分组,javascript,arrays,grouping,Javascript,Arrays,Grouping,假设我们在Javascript中有这样一个集合: [ { date: 'Fri, 02 May 2014 19:05:00 GMT', value:'abc' }, { date: 'Fri, 02 May 2014 23:43:00 GMT', value:'jkl' }, { date: 'Fri, 02 May 2014 19:01:00 GMT', value:'def' }, { date: 'Fri, 02 May 2014 19:09:00 GMT'
[
{ date: 'Fri, 02 May 2014 19:05:00 GMT', value:'abc' },
{ date: 'Fri, 02 May 2014 23:43:00 GMT', value:'jkl' },
{ date: 'Fri, 02 May 2014 19:01:00 GMT', value:'def' },
{ date: 'Fri, 02 May 2014 19:09:00 GMT', value:'ghi' },
{ date: 'Fri, 02 May 2014 23:54:00 GMT', value:'mno' }
]
我想找到一个优雅的算法,按“最近”日期按此数组分组。如果某个日期在上一个日期之前或之后15分钟,它将被推入同一个对象中
我并不在乎子数组的结构。此条目的结果可能是:
[
[
{ date: 'Fri, 02 May 2014 19:05:00 GMT', value:'abc' },
{ date: 'Fri, 02 May 2014 19:01:00 GMT', value:'def' },
{ date: 'Fri, 02 May 2014 19:09:00 GMT', value:'ghi' }
], [
{ date: 'Fri, 02 May 2014 23:43:00 GMT', value:'jkl' },
{ date: 'Fri, 02 May 2014 23:54:00 GMT', value:'mno' }
]
]
我尝试过使用下划线.js,但没有真正成功:
_.map(logs_by_date, function(group, date) {
return _.reduce(group, function(memo, elem) {
var moment = get_moment(elem);
memo[moment].push(elem);
return memo;
}, { 'date': date});
});
首先是:
您可以使用groupBy函数尝试同样的解决方案,该函数的设计间隔为15分钟而不是几年,使用返回Math.floor(+(obj.date)/(1000*60*15))
此返回语句使用+
将日期对象转换为毫秒数(从历元开始),然后除以1000*60*15,每隔15分钟使用Math.floor()
丢弃分数
要使其工作,obj.date必须是date类型。如果您的日期只是字符串,您可能首先需要
这将创建15分钟的绝对时钟块,即01:00:00-01:14:59.9999、01:15:00-01:29:59.9999;不是以新活动开始的15分钟
因此,如果您希望一组15分钟的数据以新数据开始,则groupBy函数需要创建一个闭包保留状态,即当前组何时结束,以便可以启动新组,并且需要从按日期排序的对象中输入数据,以便首先进行排序
这听起来像鲁布·戈德伯格(Rube Goldbergish),直接这样做可能更容易(未经测试):
fixDates(objArray);//您将编写一个函数,用于将日期字符串转换为日期对象
函数比较(a,b){return(+a.date)-(+b.date);}
objArray.sort(compareDates);//排序到位,数组已更改
变量组=[],g=[],d=0;
对于(var gx=+objArray[0]。日期+15*60*1000,i=0,l=objArray.length;igx){
组。推(g);
g=[];
gx=+objArray[i].日期+15*60*1000;
}
g、 推(objArray[i]);
}
组。推(g);//包括最后一组,否则不推压
//分组
我非常喜欢这种工作。他们有一个groupBy
功能,应该会有所帮助@时间什么时候开始?是从列表中最早的时间算起每隔15分钟一次,还是从最早的时间算起每隔15分钟一次,还是其他什么不同的事情?@StéphanLascar在这种情况下,你意识到答案不是唯一的吗?同样,如果您查看日期19:00:00
、19:10:00
和19:20:00
,您将如何对它们进行分组?提供日期的顺序是否相关?您应该能够通过一点努力弄清楚这一点。这里有一个非常详细的例子让你开始->这只是一个如何做的例子,这就是为什么我没有把它作为一个答案,我真的不太清楚排序规则应该是什么,但这会给你你想要的结果为特定的数据,但如果你有十次五分钟的间隔,它们是否都应该在同一个数组中结束,或者是否应该使用某种初始时间等等。这一切都非常不清楚!
var dateGroups = _.chain(objarray)
.groupBy(function(obj) { return obj.date.getFullYear(); })
.sortBy(function(v, k) { return k; })
.value();
fixDates(objArray); // a function you'll write to turn your date strings into Date objects
function compareDates(a,b){ return (+a.date)-(+b.date); }
objArray.sort(compareDates); // sorts in place, array is changed
var groups = [], g=[], d=0;
for (var gx=+objArray[0].date+15*60*1000,i=0,l=objArray.length; i<l; ++i){
d = +(objArray[i].date);
if (d>gx){
groups.push(g);
g = [];
gx = +objArray[i].date+15*60*1000;
}
g.push(objArray[i]);
}
groups.push(g); // include last group otherwise unpushed
// result in groups