【问题标题】:Split array of objects into new arrays based on year of object's date根据对象日期的年份将对象数组拆分为新数组
【发布时间】:2012-03-05 12:22:09
【问题描述】:

我有一个名为 objarray 的对象数组。每个对象如下所示:

var object = {
    age: "45"
    coords: "-37.807997 144.705784"
    date: Sun Jul 28 2002 00:00:00 GMT+1000 (EST)
}

日期是一个日期对象)

我需要根据日期将每个对象推入一个新数组中。我希望最终结果如下所示:

var dateGroups = [[object, object, object],[object, object], [object, object, object]];

dateGroups 中的每个数组都包含具有相同日期的对象。

这可能与数组有关吗?以前我生成了一个新对象,其中包含按日期分组的所有 objarray 对象(从数据生成的日期):

var alldates = {
  "1991" : [object, object, object],
  "1992" : [object, object],
  //etc...
}

以上在实践中似乎是一个奇怪的解决方案,我只需要能够按年份访问对象:即 dateGroups[0] = 第一年的对象数组

如何将数据放入 dateGroups 数组之类的东西中?有没有更好的方法来存储这种类型的数据?

【问题讨论】:

  • 最好为此选择 JSON。
  • 什么样的 JSON 结构适合按日期分组?

标签: javascript arrays date grouping


【解决方案1】:

使用reduce的答案。

var ans = objects.reduce(function(prev,curr) {
    if (!prev[curr.date.getFullYear()]) prev[curr.date.getFullYear()] = [];
    prev[curr.date.getFullYear()] = curr;
    return prev;
},[]).reduce(function(prev,curr) {
    prev.push(curr);
    return prev;
},[]);

第一个 reduce 用于按日期对对象进行分组,第二个 reduce 用于使数组的键从 0 运行到不同年份的数量 - 而不是键是年份本身。

【讨论】:

    【解决方案2】:

    考虑使用Underscore.jsgroupBy 函数,然后使用sortBy

    groupBy 将产生一个类似alldates 的结构,如果你这样称呼它:

    var alldates = _.groupBy(objarray, function(obj) {
        return obj.date.getFullYear();
    });
    

    sortBy 可以用来简单地按键排序,像这样:

    var dateGroups = _.sortBy(alldates, function(v, k) { return k; });
    

    您也可以像这样将两者结合起来:

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

    根据您的用例,我可以看到使用数组数组或数组对象映射的原因。如果您正在查找索引,请务必使用后者。

    【讨论】:

    • 这非常有效。谢谢!以后我肯定需要使用索引。
    • 纯javascript版本?我们不允许使用这个库(loadsh)
    • 如果没有 lodash 或类似的库,基于 reduce like naortor's 的解决方案是最好的起点。
    【解决方案3】:

    一旦您将日期置于如下所示的结构中:

    var alldates = {
      "1991" : [object, object, object],
      "1992" : [object, object],
      //etc...
    }
    

    您可以使用此代码将它们转换为您想要的结构:

    var dateGroups = [];
    
    for(var year in allDates){
       dateGroups[dateGroups.length] = allDates[year];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 2020-04-22
      • 2021-12-25
      • 2016-09-23
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多