2012-02-14 78 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到不同的年數數組的關鍵 - 而不是鍵爲當年的自己。