0

私は問題を抱えています。Freenodeの#documentcloudで助けを求め、いくつかの提案を得ましたが、それでも問題を解決するのに役立ちませんでした。

基本的に私はコレクションを持っており、最大2〜3千のアイテムがあり、並べ替える必要がありますが、特定の時間にのみ並べ替える必要があります。コンパレータ関数を使用すると問題ありませんが、すべてのアイテムがコレクションに追加されると、2〜3000個のアイテムのいずれかが追加されるたびにコレクション全体が再利用されるため、かなり時間がかかります。

私はいくつかの提案を試しました。1つは次のとおりです。

collection.comparator = function(object) { object.get('sortBy'); };
collection.sort();
collection.comparator = undefined;

これは惨めに失敗し、まったく並べ替えられません。これをcollection.sortBy(...)使用してみたところ、並べ替えられたコレクションが返されるようですがcollection = collection.sortBy(...)、並べ替えたコレクションを配列として変数にダンプするだけなので、役に立ちませんcollection。コレクション関数またはユーティリティを使用しようとすると、.eachがコレクションに対して未定義であるなどのエラーが発生します。

何か案は?

4

3 に答える 3

3

Collection.sort が実際に Collection.comparator を呼び出すという理由だけで、これを行うことはできません。

基本的に3つのオプションがあります

オプション 1

モデル自体にコンパレータなしでソートメソッドを強制できます(基本的にコレクションの .sort を呼び出すのと同じですが、.comparator はありません

// in your collection class

_comparator: function(a,b) { /* comparator code */ }

sorter: function() {
   // Of course you should bind this to your collection at this function 
   // and your comparator

   this.models.sort( _comparator ) // .models gives you the array of all models
}

オプション 2

コレクションに何かを追加するたびにコンパレータを削除します

_comparator = function(a,b) { /* comparator code */ }
collection.comparator = undefined
collection.fetch({ success: function() { collection.comparator = _comparator })

オプション 3

コードを少し先取りして、コレクションをこのように表示したいという理由だけでコレクションを並べ替えたい場合は、単に並べ替えて表示することができます。

collection.returnSorted = function () { return collection.sortBy( _comparator ) }
于 2012-04-15T15:54:23.307 に答える
3

これを試して:

collection.add(model, {sort: false});
于 2013-07-11T08:07:06.030 に答える
0

_.sortedIndex()個々のアイテムが既にソートされたリストに追加されたとき に使用すると機能しますか?

、そのインデックスに基づいたリスト、次にsortedIndex: part1 + new_entry + part2を簡単に把握できます。slicesplice

これにより、リスト全体を毎回ソートする必要がなくなります。適切な場所に 1 つの新しいエントリを挿入するだけです。

私の答えは、2000 以上のアイテム コレクションの最初の並べ替えを既に行うことができ、新しいアイテムが一度に 1 つずつ追加されたときのリゾートの問題を克服しようとしているだけだと仮定しています。あなたの質問には、問題がどこにあるのかについての具体性が欠けています。

于 2012-04-15T14:42:22.357 に答える