如何将数组排序为Javascript中添加的项目?

时间:2015-02-24 21:17:36

标签: javascript arrays sorting

我有一个对象数组,其元素使用AngularJS中的ng-repeat显示。每个对象都有一个priority_int整数值,我知道我可以使用以下命令对数组进行降序排序:

array.sort(function(a,b){
    return b.priority_int - a.priority_int;
}

目前,我将所有内容添加到数组中,然后按优先级降序排序,然后使用ng-repeat显示。

出于好奇,我每次将对象推入数组时如何排序?

2 个答案:

答案 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]