停止从排序本身收集,但仍然能够排序我

时间:2012-04-15 14:29:28

标签: javascript backbone.js underscore.js

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

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

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

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

这个失败并且根本没有排序,我也尝试使用collection.sortBy(...)这似乎返回已排序的集合,但是当我尝试collection = collection.sortBy(...)时它对我没有用它只是将已排序的集合作为数组转储到变量collection中。当我尝试使用集合函数或实用程序时,我会收到类似.each未定义的错误等等。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这不能简单地完成,因为Collection.sort实际上调用了Collection.comparator。

你基本上有三个选择

选项一

你可以强制你的排序方法没有比较器到模型本身(基本上与调用你的集合的.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
}

选项二

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

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

选项三

如果你认为你的代码稍微超前一点,只是想让你的收藏品只是因为想要以这种方式显示它而被排序,你可以简单地在显示器上对它进行排序

collection.returnSorted = function () { return collection.sortBy( _comparator ) }

答案 1 :(得分:3)

试试这个:

collection.add(model, {sort: false});

答案 2 :(得分:0)

将单个项目添加到已排序的列表时,是否可以使用_.sortedIndex()

您可以根据该索引轻松找出sortedIndexslice列表,然后splice:part1 + new_entry + part2。

这使您无法每次都对整个列表进行排序。你只是在正确的位置插入一个新条目。

我的回答假设您已经能够对2000多个项目集合进行初步排序,并且您只是尝试在一次添加一个新项目时克服度假问题。您的问题缺乏关于问题确切位置的特异性。