2012-02-14 11 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を選択した方が良いです。 –

+0

日付でグループ化するにはどのような種類のJSON構造が適していますか? – tamarasaurus

答えて

7

Underscore.jsgroupBy関数を使用し、次にsortByを使用することを検討してください。

var alldates = _.groupBy(objarray, function(obj) { 
    return obj.date.getFullYear(); 
}); 

sortByはこのように、キーにより簡単にソートするために使用することができます:

var dateGroups = _.sortBy(alldates, function(v, k) { return k; }); 

あなたはまた、組み合わせることができ

groupByは、あなたがそうのようにそれを呼び出す場合、alldatesのような構造が生成されます2つはこのようになります:

var dateGroups = _.chain(objarray) 
        .groupBy(function(obj) { return obj.date.getFullYear(); }) 
        .sortBy(function(v, k) { return k; }) 
        .value(); 

Dあなたのユースケースを考えれば、配列の配列を使う理由や配列のオブジェクトマップを見ることができます。あなたがインデックスを見ているなら、間違いなく後で使用してください。あなたはこのようになります構造内の日付たら

+0

これはすごくうまくいった。ありがとう!私は間違いなく後でインデックスを使用する必要があります。 – tamarasaurus

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から実行する配列のキーを作るためのものです - 鍵は今年そのものであることの代わりに。