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