2012-10-08 194 views
0

通过使用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; 
}, 

回答

1

一种方法是通过使用comparator方法使用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; 
    } 
}); 
1

Live demo here

如何:

var result = _.chain(this.collection.models) 
    .pluck('attributes') 
    .max(function(value) { 
     return value.id; 
    }) 
    .value(); 
+0

作者不需要一个对象,他需要一个增加1的id。 –

-1
var max = _.max(this.collection.pluck('id')) + 1; 

,并且不使用这个:

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

这是正确的方法:

this.collection.reset([{id: 1}, {id: 2}]) 
+0

这假定只有属性对象具有一个id元素,这可能是一个不正确的假设。 –

+0

@GabrielFlorit作者说“JavaScript对象是一个Backbone.Collection”,所以这是正确的假设。 –

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机器,并不意味着你必须在任何地方使用它。

+0

+1,关于你的第二个解决方案:'this.models.each(function(m){' - >'_.each(this.models,function(m){' –

+0

@LorraineBernard:或者更好,'this.each (...)'因为[一串Underscore被混入集合中](http://backbonejs.org/#Collection-Underscore-Methods)。 –

2

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

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

我知道这对lodash库是真实的,不知道它是真正的底线。

干杯!

+0

http://jsfiddle.net/g5trn/ – Shanimal