2012-03-31 14 views
8

(一部のモデルのみを示す)の例コレクション:Backbone.jsでgroupByを使用してコレクションをグループ化するにはどうすればいいですか?

[ 
    { 
     name: "Bob" 
     date: "Thu Mar 29 2012" 
    }, 
    { 
     name: "James" 
     date: "Fri Mar 30 2012" 
    }, 
    { 
     name: "Dylan" 
     date: "Fri Mar 30 2012" 
    }, 
    { 
     name: "Stanley" 
     date: "Sat Mar 31 2012" 
    }, 
] 

がどのように私は同じ日付でグループのモデルにUnderscore.js' GROUPBY機能を使用することができますか?

+1

あなたは、日付 'の前にカンマを忘れてしまった:' – ThiefMaster

答えて

5

使用_.groupBy(data, 'date');

また、カスタム関数を渡す使用することができますが、上記の属性のショートカット構文は正常に動作として、この場合には必要ありません。

_.groupBy(data, function(row) { 
    return row.date; 
}); 

デモ:

> _.groupBy(data, 'date') 
{ 'Thu Mar 29 2012': [ { name: 'Bob', date: 'Thu Mar 29 2012' } ], 
    'Fri Mar 30 2012': 
    [ { name: 'James', date: 'Fri Mar 30 2012' }, 
    { name: 'Dylan', date: 'Fri Mar 30 2012' } ], 
    'Sat Mar 31 2012': [ { name: 'Stanley', date: 'Sat Mar 31 2012' } ] } 
> _.groupBy(data, function(row) { return row.date }); 
{ 'Thu Mar 29 2012': [ { name: 'Bob', date: 'Thu Mar 29 2012' } ], 
    'Fri Mar 30 2012': 
    [ { name: 'James', date: 'Fri Mar 30 2012' }, 
    { name: 'Dylan', date: 'Fri Mar 30 2012' } ], 
    'Sat Mar 31 2012': [ { name: 'Stanley', date: 'Sat Mar 31 2012' } ] } 
> 
+2

は、ビューを設定する方法があります1つのモデルがあるグループから別のグループに移動すると、自動的にこれらのビューを同期させますか?たとえば、あるモデルの日付を変更した場合、そのモデルを別のグループに移動する必要があり、それに応じてビューを更新する必要があります。半自動的に(おそらくマリオネットを使用して)これを行う方法は何ですか?または手動でこれを行う必要がありますか? – ragulka

+3

これは実際のバックボーンコレクションでは機能しません.bullfrogによる回答は正しいです。 –

10

ThiefMaster答えは完全に有効ですが、タイトルが示すように、私はBACKBONE.JS収集のためのソリューションを探していたので、それは私にいくつかの混乱を引き起こしました。

質問オブジェクトは、我々は、日付によってグループにモデルを次の操作を行う必要があり、バックボーンコレクションの場合:

_.groupBy(collection.models, function(model){ 
    return model.get('date') 
}); 

私はあなたが実際のバックボーンコレクションをグループ化している場合、それは

+0

これは、質問された質問に対する実際の回答です。 – dcarson

4
var groups =collection.groupBy(function(model) { return model.get('date'); }); 

//iterate over groups 
for(date in groups) { 
    var models = groups[date]; 
    console.log('date: '+date); 
    for (var model_idx in models) { 
     console.log(' name: '+ models[model_idx].get('name')); 
    } 
} 
47

を役に立てば幸い暗黙的にアンダースコア_.groupBy機能を使用するバックボーン・メソッドgroupByを使用することができます。私の意見では、これははるかにクリーンなアプローチです。代わりにアンダースコアのLodashを使用したもの、あなたが_.method()アクセサを使用して同じ結果を得ることができますについては

collection.groupBy(function(model){ 
    return model.get('date'); 
}); 
+1

これは質問された質問に対する実際の回答です。 – dcarson

+0

これは、バックボーンを使用してグループ化する方法を説明する回答です。上記の答えは、下線を使用してグループ化することをお勧めします –

+8

あなたは短縮形を使用することもできます:collection.groupBy( '​​date') – fadomire

0

collection.groupBy(_.method('get', 'date')); 
関連する問題