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

2023-11-21

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

我尝试使用 underscore.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});
});

下划线来自 tjd ett 的 JS 代码,用于按年份分组的问题:

var dateGroups = _.chain(objarray)
                  .groupBy(function(obj) { return obj.date.getFullYear(); })
                  .sortBy(function(v, k) { return k; })
                  .value();

您可以使用为 15 分钟间隔而不是几年设计的 groupBy 函数来尝试相同的解决方案,return Math.floor(+(obj.date)/(1000*60*15));该返回语句使用+将 Date 对象转换为毫秒数(自纪元起),然后除以 1000*60*15,得到 15 分钟的间隔Math.floor()丢弃分数。

为此,obj.date 必须是 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 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐