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

7

我有一个对象数组叫做objarray。每个对象看起来像这样:

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

(date 是一个日期对象)

我需要根据日期将每个对象推入一个新的数组中。我希望最终结果看起来像这样:

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来处理这个。 - Chamika Sandamal
哪种JSON结构适合按日期分组? - tamarasaurus
3个回答

11
考虑使用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();

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


这个非常好用。谢谢!我以后肯定需要使用索引。 - tamarasaurus
有没有纯JavaScript版本的?我们不允许使用这个库(loadsh)。 - iamrajshah
没有Lodash或类似的库,基于 reduce 的解决方案 像 naortor 的 是最好的起点。 - tjdett

2
使用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到不同年份数量的数字。


有点晚了,但我认为应该是 if(!prev[...]) {prev[...] = [curr];} else {prev[...].push(curr)}。 - MrToast

-1

一旦您将日期存储在类似于以下结构的结构中:

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

你可以使用这段代码将它们转换为你想要的结构:

var dateGroups = [];

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接