2012-02-14 68 views
5

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

+0

最好为此选择JSON。 – 2012-02-14 04:35:32

+0

什么样的JSON结构适合按日期分组? – tamarasaurus 2012-02-14 04:38:16

回答

7

考虑使用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根据你的用例,我可以看到使用数组数组或数组对象映射的原因。如果你正在查找索引,一定要使用后者。

+0

这很奇妙。谢谢!我以后肯定会需要使用这些索引。 – tamarasaurus 2012-02-14 05:01:02

0

一旦你有看起来像这样的结构日期:

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

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

var dateGroups = []; 

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

的回答使用减少。

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到不同的年数数组的关键 - 而不是键为当年的自己。