0

我有一个问题,我在 Freenode 上的#documentcloud 中寻求帮助并得到了一些建议,但仍然没有帮助我解决我的问题。

基本上我有一个集合,非常大,最多可容纳 2-3 千个项目,并且它 - 必须 - 进行排序,但它只需要在特定时间进行排序。使用比较器功能很好,它可以保持排序,但是当所有项目都添加到集合中时会花费更长的时间,因为每次添加 2-3000 个项目中的一个时它都会重新使用整个集合。

我尝试了一些建议,其中一个是:

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.comarator 就可以做到。

你基本上有三个选择

选项一

您可以强制您的排序方法不带模型本身的比较器(与调用集合的 .sort 基本相同,但没有 .comarator

// 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
}

选项二

每次向集合中添加内容时删除比较器

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

选项三

如果你想的有点超前于你的代码,并且只是因为你想以这种方式显示它而只想对你的集合进行排序,你可以简单地在显示时对其进行排序

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

这可以防止您每次都对整个列表进行排序。您只是在正确的位置插入一个新条目。

我的回答假设您已经能够进行 2000 多个项目集合的初始排序,并且您只是试图克服一次添加一个新项目时的求助问题。您的问题缺乏关于您的问题到底在哪里的具体性。

于 2012-04-15T14:42:22.357 回答