如何选择Backbone集合的属性

时间:2011-09-28 17:50:42

标签: javascript backbone.js underscore.js backbone-collections

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

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

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

这有效,但似乎效率低下。有没有办法在不必定义days三次的情况下完成同样的事情?

5 个答案:

答案 0 :(得分:34)

pluck是一种包装map的便捷方法,而map可以直接在集合中使用,这样可以使这更容易。

假设您尝试从模型中获取date属性,则可以执行以下操作:

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

您的选择调用也可以作为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);

这应该返回你想要的结果......或者至少接近这个结果:)

答案 1 :(得分:17)

我应该更仔细地阅读文档。除了下划线中的pluck方法之外,主干集合还具有pluck方法。

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

所以,我的解决方案是

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

我仍然需要弄清楚如何最好地结合过滤 - 也许使用来自@ Derick的答案的想法,但这回答了我自己的问题。

答案 2 :(得分:6)

我认为这可行:

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

稍微更优雅,但在我看来仍然接近不可读。

答案 3 :(得分:5)

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

var days = _.invoke(this.collection.where({type : 'session'}), 'get', 'date');

答案 4 :(得分:0)

这在功能上与Derick使用_.chain()

的答案相同
var days = _(this.collection.models)
            .chain()
            .filter(function(model){return model.attributes.type === 'session';})
            .pluck('date')
            .value();