0

underscoreまたはを使用して、オブジェクトのリストに含まれている値を1つ増やした値 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;
},
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

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

ライブデモはこちら

これはどう:

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 に答える