Javascript JS日期数组如何按天分组

Javascript JS日期数组如何按天分组,javascript,underscore.js,momentjs,Javascript,Underscore.js,Momentjs,我正试图找出一种最理想、循环次数最少的方法来对我的js dates对象数组进行分组:(请注意,这是浏览器控制台输出,实际上是真实的js日期,如new Date()) 在oragnized数组中,将同一天的每个日期都放在一个“块”中,这样我就可以在UI“Aug 08”上显示它,并显示当天的2个或多少个日期 例如: [{day: 'Aug 08', times:[Sat Aug 08 2015 08:30:00 GMT+0200 (Central Europe Daylight Time), Sat

我正试图找出一种最理想、循环次数最少的方法来对我的js dates对象数组进行分组:(请注意,这是浏览器控制台输出,实际上是真实的js日期,如new Date())

在oragnized数组中,将同一天的每个日期都放在一个“块”中,这样我就可以在UI“Aug 08”上显示它,并显示当天的2个或多少个日期

例如:

[{day: 'Aug 08', times:[Sat Aug 08 2015 08:30:00 GMT+0200 (Central Europe Daylight Time), Sat Aug 08 2015 09:30:00 GMT+0200 (Central Europe Daylight Time)]}]
我现在的想法是

var startDays = _.map(occurences, function (date) {
  return moment(date).startOf('day').format();
});
在此之后,要获得独特的天数:

_.uniq(startDays, true)

在我得到了独特的日子之后,另一个循环将同一天添加到这个组中,正如你现在所看到的,你可能会明白为什么我不喜欢它,这就是为什么我想得到一些聪明的帮助,因为没有任何东西会进入我的头脑。谢谢。

为什么需要此优化?如果您的数组不太大,那么您可能不需要优化算法

我不熟悉给定的js库,但您可以使用一个循环按天对阵列进行分组。但您需要以某种方式确定数组中的当前日期,然后使用day字段和times数组字段创建相应的js对象,然后将此对象添加到生成的数组中。
如果在实现此算法之前对数组进行预排序,速度会快得多。

假设您的数据实际上是字符串,我不知道您为什么认为需要这两个库中的任何一个。您只是基于子字符串对字符串进行分组

介绍了ES5,这对积累东西很有帮助:

用于创建日期数组的助手:

// Generate a dates array given a start date and how many to create:
function genDates(startDate, count) {
  var d = new Date(+startDate),
      dates = [d];
  for (var i=0; i<count; i++) {
    d = new Date(+d);
    d.setHours(d.getHours() + 10);
    dates.push(d);
  }
  return dates;
}
//在给定开始日期和创建数量的情况下生成日期数组:
函数性别(起始日期、计数){
var d=新日期(+起始日期),
日期=[d];
for(var i=0;i下划线具有一个函数,该函数应该完全满足您的要求:

var groups = _.groupBy(occurences, function (date) {
  return moment(date).startOf('day').format();
});
这将返回一个对象,其中每个键都是一天,该值是一个包含该天所有事件的数组

要将对象转换为与问题中相同形式的数组,可以使用map:

var result = _.map(groups, function(group, day){
    return {
        day: day,
        times: group
    }
});
要进行分组、映射和排序,您可以执行以下操作:

var occurrenceDay = function(occurrence){
    return moment(occurrence).startOf('day').format();
};

var groupToDay = function(group, day){
    return {
        day: day,
        times: group
    }
};

var result = _.chain(occurences)
    .groupBy(occurrenceDay)
    .map(groupToDay)
    .sortBy('day')
    .value();

如果您还需要按或(和)和天进行分组,我建议使用我的解决方案

在上面的答案中,如果你在同一天得到不同的月份或年份,你的分组将是不正确的

查看好的解决方案

_.groupBy(arrayOfDates, function (el) {
      return (el.getFullYear() + '|y|') + (el.getMonth() + '|m|') + (el.getDate() + '|d|');
    });
我在这里做什么?只需为每个日期创建一个唯一的键,包括:年、月和日。然后我用这个唯一的键对数组进行分组


你看过使用.groupBy而不是.map吗?@grufbunny我没有意识到!我现在要研究的是,thanksit不是字符串,它实际上是日期对象,它只是控制台输出,所以可以使用内部瞬间(date)或简单的内置JS日期对象,它与new date()相同.但是谢谢你的方式!看起来很有趣,我将尝试将此技术应用到我的momet()循环中checks.P.S这两个库在我的项目中都是可用的,所以使用它们只会让生活更轻松希望下划线reduce是一样的吗?深入研究这一点,我肯定学到了一种添加和检查数组的技术,我可以最终实现类似的功能。但是下划线实际上有u。groupBy让生活更轻松。所以我只是想为了感谢你给我的时间,我从中学到了这一点,将来我将能够立即在脑海中思考解决方案!有没有办法找回一个数组?顺序很重要,我并不需要每个组的引用,所以如果它是一个数组就可以了。试着迭代它和{{{每个对象}不支持MeteorThank!顺序保证是一样的吗?希望groupby能把它搞糟,我想可能是因为它是一个对象,所以可能更安全的方法是甚至不将它转换为对象,并使用一些自定义函数将其正确地转换为数组?javascript对象中的键顺序不能保证,所以要确定您在映射之后,我将使用u.sorttBy。我添加了一个额外的片段,显示了使用下划线链接所做的一切。非常感谢您的帮助。出于好奇,有没有办法测试这有多快?我一直认为使用太多循环会有限制或恐惧,所以我想我可以对它进行测试,看看它是如何工作的s:)测试js性能是有必要的。如果性能是一个问题,那么编写良好的纯js解决方案通常会更快。但您在性能方面获得的东西通常会在代码清晰性和表达能力方面失去。
var occurrenceDay = function(occurrence){
    return moment(occurrence).startOf('day').format();
};

var groupToDay = function(group, day){
    return {
        day: day,
        times: group
    }
};

var result = _.chain(occurences)
    .groupBy(occurrenceDay)
    .map(groupToDay)
    .sortBy('day')
    .value();
_.groupBy(arrayOfDates, function (el) {
      return (el.getFullYear() + '|y|') + (el.getMonth() + '|m|') + (el.getDate() + '|d|');
    });