Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中按15分钟的间隔对json集合进行分组_Javascript_Arrays_Grouping - Fatal编程技术网

如何在Javascript中按15分钟的间隔对json集合进行分组

如何在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'

假设我们在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', 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