16

Backbone コレクションから特定の属性値の配列を作成したいと考えています。

var days = _.select(
    this.collection.models,
    function(model) {
        return model.attributes.type === 'session';
    }
);

days = _.pluck(days, 'attributes'),
days = _.pluck(days, 'date');

これは機能しますが、効率が悪いようです。days3回定義せずに同じことを達成する方法はありますか?

4

5 に答える 5

34

pluck は をラップする便利なメソッドでmapありmap、コレクションで直接利用できるため、これが容易になります。

モデルから属性を取得しようとしていると仮定するとdate、次のことができます。

days = this.collection.map(function(model){
  return model.get('date');
});

filterselect 呼び出しは、メソッドとしてコレクションでも直接利用できます。

days = this.collection.filter(function(model){ 
  return model.attributes.type === 'session'; 
});

これら 2 つを連鎖させることもできますが、メソッドを個別に定義すると役立ちます。

var sessionFilter = function(model){
  return model.attributes.type === 'session'; 
};
var getDate = function(model){ return model.get('date'); }

days = this.collection.filter(sessionFilter).map(getDate);

これはあなたが探している結果を返すはずです...または少なくともこれに近いもの:)

于 2011-09-28T18:09:42.170 に答える
18

ドキュメントをもっと注意深く読むべきでした。アンダースコアのメソッドに加えてpluck、バックボーン コレクションにもpluckメソッドがあります。

http://documentcloud.github.com/backbone/#Collection-pluck

だから、私の解決策は

//Assumme 'collection' is a backbone collection
collection.pluck('date');

おそらく@Derickの回答のアイデアを使用して、フィルタリングと最適に組み合わせる方法を理解する必要がありますが、これは私自身の質問の要点に答えます。

于 2011-09-28T18:15:56.363 に答える
6

私はこれがうまくいくと思います:

var days =
    _( this.collection.where({ type : "session" }))
    .chain()
    .pluck("attributes")
    .pluck("date")
    .value()

私の意見では、もう少しエレガントですが、まだ読めないに近いです。

于 2012-06-26T18:33:30.247 に答える
0

これは、 _.chain()を使用した Derick の回答と機能的に同じです。

var days = _(this.collection.models)
            .chain()
            .filter(function(model){return model.attributes.type === 'session';})
            .pluck('date')
            .value();
于 2012-01-12T19:56:41.610 に答える