0

コレクションをフィルタリングしてから、フィルタリングされた値をシャッフルしようとしています。

whereBackboneが提供する方法を使用することを考えていました。何かのようなもの:

myRandomModel = @.where({ someAttribute: true }).shuffle()[0]

ただし、属性に一致するすべてのモデルの配列whereを返します。どうやら動作するリストが必要です:shuffle

shuffle_ .shuffle(list)リスト
のシャッフルされたコピーを返します

http://documentcloud.github.com/underscore/#shuffle

モデルの配列を「リスト」に変える方法はありますか?それとも、これを行うために自分でロジックを作成する必要がありますか?

4

4 に答える 4

3

アンダースコアドキュメントがリストと言うとき、それらは配列を意味します。_.shuffleしたがって、次のように使用できます。

shuffled = _([1, 2, 3, 4]).shuffle()

またはあなたの場合:

_(@where(someAttribute: true)).shuffle()

ただし、単一のモデルを取得しているだけなので、シャッフルする代わりにランダムなインデックスを生成するだけで済みます。

matches = @where(someAttribute: true)
a_model = matches[Math.floor(Math.random() * matches.length)]
于 2012-10-20T16:37:21.760 に答える
2

shuffle()andwhere()メソッドは、バックボーンコレクションのアンダースコアメソッドのプロキシにすぎません。アンダースコアメソッドは、配列を引数として、それ自体で機能します。これが私がすることです:

myRandomModel = _.shuffle(@.where({ someAttribute: true }))[0]

参照:http ://documentcloud.github.com/underscore/#shuffle

PS:@ "mu is too short"は正しいですが、単一のモデルを取得するには、Math.random()自分でやります。

于 2012-10-20T20:14:34.317 に答える
0

私は自分のapplication.jsファイルに以下を入れました(Rails 3を使用):

Array.prototype.shuffleArray = function() {
  var i = this.length, j, tempi, tempj;
  if ( i === 0 ) return false;
  while ( --i ) {
     j       = Math.floor( Math.random() * ( i + 1 ) );
     tempi   = this[i];
     tempj   = this[j];
     this[i] = tempj;
     this[j] = tempi;
  }
  return this;
};

これで、配列の配列に対してshuffleArray()を呼び出すことができます。ただし、アンダースコア/バックボーンを使用してそれを行うためのより良い方法があるかどうかを知りたいので、今のところこれを未回答のままにしておきます。

于 2012-10-20T15:59:10.300 に答える
0

コレクションの最初に、次のようなフィルター処理された関数が必要です。

var MyCollection = Backbone.Collection.extend ({
  filtered : function ( ) { 

通常、_。filterを使用して必要なモデルのみを取得しますが、代わりにsuffleを使用することもできます。this.modelsを使用してコレクションモデルを取得します。ここでシャッフルはモデルを混合します

    var results = _ .shuffle( this.models ) ;

次に、アンダースコアを使用して結果をマップし、次のようにJSONに変換します。

    results = _.map( results, function( model ) { return model.toJSON()  } );

最終的に結果のみを含む新しいバックボーンコレクションを返す場合は、jsonのみを返すことができます。

    return new Backbone.Collection( results ) ;

後で使用するためにすべてのデータを収集したくない場合は、以下を使用して、以下のビューを無視することができます。

    this.reset( results ) ;        
  }
});
于 2013-10-18T14:45:43.163 に答える