根据对象的日期年份将对象数组拆分为新数组

时间:2012-02-14 04:28:44

标签: javascript arrays date grouping

我有一个名为 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 数组?有没有更好的方法来存储这种类型的数据?

3 个答案:

答案 0 :(得分:8)

考虑使用Underscore.js groupBy函数,然后使用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();

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

答案 1 :(得分: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用于按日期对对象进行分组,第二个用于使数组的键从0运行到不同年份的数量 - 而不是键是年份本身。

答案 2 :(得分:-1)

如果结构中的日期如下所示:

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

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

var dateGroups = [];

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