您可以尝试使用两个参数comparator
:
比较器函数可以定义为 a sortBy
(传递一个接受单个参数的函数),或定义为 a sort
(传递一个需要两个参数的比较器函数)。
这样您就可以使用本机sort
而不是下划线的sortBy
; 和调用以及为Schwartzian TransformsortBy
构建对象有一些开销;施瓦茨变换只有在计算排序键很昂贵、并不昂贵并且(无论如何都是如此)仍然更便宜时才有意义。_.pluck
_.map
m.get(a)
m.attributes[a]
get
所以一个简单的第一次尝试是:
comparator: function(a, b) {
if(a.attributes.timestamp < b.attributes.timestamp)
return -1;
else if(a.attributes.timestamp > b.attributes.timestamp)
return 1;
return 0;
}
该Collection#add
方法在每次插入时对集合进行排序:
for (i = 0, length = models.length; i < length; i++) {
//...
if (this.comparator && options.at == null) this.sort({silent: true});
//...
}
除非您告诉它使用该at
选项将模型放在哪里;该"add"
事件包括新添加元素的索引,因此集合需要对每次插入进行排序,以便事件具有正确的值。但是,如果您可以在调用之前对模型进行预排序add
并手动找到正确的插入点,那么您可以跳过sort
内部的调用add
。当然,您可能必须一个接一个地添加模型,但这应该不难:只需同时浏览新的(预排序的)模型和现有的集合,以找出每个模型的正确插入点。