从对象列表中获取属性

时间:2012-10-08 18:38:26

标签: javascript jquery backbone.js underscore.js

使用underscorejQuery我需要将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;
},

5 个答案:

答案 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)

Live demo here

这个怎么样:

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}])