我有一个对象数组,其元素使用AngularJS中的ng-repeat显示。每个对象都有一个priority_int整数值,我知道我可以使用以下命令对数组进行降序排序:
array.sort(function(a,b){
return b.priority_int - a.priority_int;
}
目前,我将所有内容添加到数组中,然后按优先级降序排序,然后使用ng-repeat显示。
出于好奇,我每次将对象推入数组时如何排序?
答案 0 :(得分:3)
每次添加元素时调用数组都会花费大量的运行时间,特别是因为一些默认的array.sort实现对于几乎排序的数组有一个O(n ^ 2)运行时。
相反,使用二进制搜索将新元素插入到排序数组中的正确位置。
检查此相关答案以获取更多帮助:
Efficient way to insert a number into a sorted array of numbers?
答案 1 :(得分:0)
最简单的方法是首先找到新元素放置位置的索引。然后,你应该在那里添加元素。
var addToReverseSortedArray = function (arr, item) {
// our function to find the index of an element
// (or where it should be placed)
var search = function (a, i) {
var low = 0, high = a.length - 1;
while (low <= high) {
var mid = (low + high) >> 1;
if (a[mid] > i) low = mid + 1;
else if (a[mid] < i) high = mid - 1;
else return mid;
}
return low;
}
// Array.splice can actually splice 0 items
// here, we splice 0 items at index search(arr, item)
// and add `item`
arr.splice(search(arr, item), 0, item);
return arr;
}
请注意,上面的函数依赖于反向排序的数组。
示例:
addToReverseSortedArray([5,4,3], 6); // [6,5,4,3]
addToReverseSortedArray([1,0,0,0], 10); // [10,1,0,0,0]