我想从Backbone集合中创建一个特定属性值的数组。
var days = _.select(
this.collection.models,
function(model) {
return model.attributes.type === 'session';
}
);
days = _.pluck(days, 'attributes'),
days = _.pluck(days, 'date');
这有效,但似乎效率低下。有没有办法在不必定义days
三次的情况下完成同样的事情?
答案 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();