根据对象日期的年份将对象阵列拆分成新阵列
我有一个对象数组,名为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阵列?有没有更好的方法来存储这种类型的数据?
考虑使用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();
D根据你的用例,我可以看到使用数组数组或数组对象映射的原因。如果你正在查找索引,一定要使用后者。
这很奇妙。谢谢!我以后肯定会需要使用这些索引。 – tamarasaurus 2012-02-14 05:01:02
一旦你有看起来像这样的结构日期:
var alldates = {
"1991" : [object, object, object],
"1992" : [object, object],
//etc...
}
你可以使用这个代码将它们转换为结构你想要的:
var dateGroups = [];
for(var year in allDates){
dateGroups[dateGroups.length] = allDates[year];
}
的回答使用减少。
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;
},[]);
第一减少是按日期分组的对象,第二个是使从0到不同的年数数组的关键 - 而不是键为当年的自己。
最好为此选择JSON。 – 2012-02-14 04:35:32
什么样的JSON结构适合按日期分组? – tamarasaurus 2012-02-14 04:38:16