0

通过使用underscoreorjQuery我需要将maximum id对象列表中包含的值增加一。

javascript 对象是 a Backbone.Collection,它看起来像这样:

this.collection.models = [{attributes: {id: 1, ....}}, {}];

我编写了以下有效的代码,但我想知道是否有任何更改可以改进它。

谢谢。

getId: function () {
  return _.max(
          _.map(
           _.pluck(this.collection.models, 'attributes'), function (attributes) {
              return attributes.id;
    })) + 1;
},
4

5 回答 5

2

_.max 接受回调迭代器函数:

var next = _.max(list, function(i) { return i.attributes.id; }).attributes.id + 1;

我知道 lodash 库是这样,不知道下划线是这样。

干杯!

于 2012-10-09T15:16:33.017 回答
1

一种方法是使用比较器方法按 id 排序您的集合。

collection.comparator = function(model) {
    return model.id;
}

当你设置它时,你的最后一个模型保证有 largets 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;
  }
});
于 2012-10-08T18:46:25.957 回答
1

Live demo here

How about this:

var result = _.chain(this.collection.models)
    .pluck('attributes')
    .max(function(value) {
        return value.id;
    })
    .value();
于 2012-10-08T18:48:06.077 回答
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 机器并不意味着你必须在任何地方使用它。

于 2012-10-08T19:24:30.113 回答
-1
var max = _.max(this.collection.pluck('id')) + 1;

不要使用这个:

this.collection.models = [{attributes: {id: 1, ....}}, {}];

这是正确的方法:

this.collection.reset([{id: 1}, {id: 2}])
于 2012-10-08T18:54:28.973 回答