使用underscore
或jQuery
我需要将maximum id
值增加一个对象列表中包含的值。
javascript对象是Backbone.Collection
,它看起来像这样:
this.collection.models = [{attributes: {id: 1, ....}}, {}];
我写了下面的代码,但是我想知道是否有任何改进来改进它。
感谢。
getId: function () {
return _.max(
_.map(
_.pluck(this.collection.models, 'attributes'), function (attributes) {
return attributes.id;
})) + 1;
},
答案 0 :(得分:2)
_.max接受回调迭代器函数:
var next = _.max(list, function(i) { return i.attributes.id; }).attributes.id + 1;
我知道lodash库是真的,不知道下划线是真的。
干杯!
答案 1 :(得分:1)
一种方法是使用comparator方法通过id来控制您的收藏。
collection.comparator = function(model) {
return model.id;
}
当你设置它时,你的最后一个模型保证有bigts id。
collection.next = function(){
return this.last().id + 1;
}
在定义集合时最好定义它们:
var Collection = Backbone.Collection.extend({
comparator: function(model) {
return model.id;
},
next: function(){
return this.last().id + 1;
}
});
答案 2 :(得分:1)
这个怎么样:
var result = _.chain(this.collection.models)
.pluck('attributes')
.max(function(value) {
return value.id;
})
.value();
答案 3 :(得分:0)
简单循环没有任何问题,在集合中这样的东西是完全可以接受的:
var max = 0;
for(var i = 0; i < this.models.length; ++i)
max = this.models[i].id > max ? this.models[i].id : max;
return max + 1;
或者如果您被迫使用下划线:
var max = 0;
this.each(function(m) {
max = m.id > max ? m.id : max;
});
return max + 1;
这两个都会进入集合内部,触摸集合外的models
数组是不礼貌的。
仅仅因为你拥有所有jQuery和Underscore机器并不意味着你必须在任何地方使用它。
答案 4 :(得分:-1)
var max = _.max(this.collection.pluck('id')) + 1;
不要使用它:
this.collection.models = [{attributes: {id: 1, ....}}, {}];
这是正确的方法:
this.collection.reset([{id: 1}, {id: 2}])