16

我想从 Backbone 集合中创建一个特定属性值的数组。

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

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

这有效,但似乎效率低下。有没有一种方法可以完成同样的事情而不必定义days三次?

4

5 回答 5

34

pluck 是一种包装的便捷方法,map可以map直接在集合上使用,这应该会使这更容易。

假设您正在尝试date从模型中获取属性,您可以这样做:

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

作为方法,您的 select 调用也可以直接在集合上使用filter

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

您可以将这两个链接在一起,但如果您分别定义方法会有所帮助:

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 回答
5

有同样的问题,并想出了一个更好的解决方案。我可能刚刚利用了下划线中的新功能,因为现在是 2013 年 :)

var days = _.invoke(this.collection.where({type : 'session'}), 'get', 'date');
于 2013-12-23T11:43:48.873 回答
0

这在功能上与 Derick 使用_.chain()的答案相同

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