在javascript中,如何对数组的子集进行排序?

时间:2011-09-15 06:12:16

标签: javascript

我有一个数组,并希望对除最后n个元素之外的所有元素进行排序。

例如,如果数组长度为10个元素,则希望对元素0到7进行排序,同时保留元素8-9。

3 个答案:

答案 0 :(得分:12)

var array = [5, 2, 6, 4, 1, 9, 3, 8, 7];
array = array.slice(0, 7).sort().concat(array.slice(7, 10));
// array is now [1, 2, 3, 4, 5, 6, 9, 8, 7]

答案 1 :(得分:4)

如果需要对数组进行排序(即不创建新的排序数组),这就是sort()方法的作用,您可以执行以下操作:

var array = [5, 2, 6, 4, 0, 1, 9, 3, 8, 7];
var unsorted = array.slice(7);
array.length = 7;
array.sort().push.apply(array, unsorted);

更一般地说,这是一个对数组的一部分进行排序的函数。与sort()方法一样,它也返回对数组的引用。

function partialSort(arr, start, end) {
    var preSorted = arr.slice(0, start), postSorted = arr.slice(end);
    var sorted = arr.slice(start, end).sort();
    arr.length = 0;
    arr.push.apply(arr, preSorted.concat(sorted).concat(postSorted));
    return arr;
}

示例:

var array = [5, 2, 6, 4, 0, 1, 9, 3, 8, 7];
partialSort(array, 0, 7);

答案 2 :(得分:3)

由@darin

提供的解决方案的ES6即兴演奏
let subSort = (arr, i, n, sortFx) => [].concat(...arr.slice(0, i), ...arr.slice(i, i + n).sort(sortFx), ...arr.slice(i + n, arr.length));
  • i 是小节开始的索引
  • n 是要排序的元素数量
  • sortFx 是排序功能

因此可以对数组中的范围进行排序:

var array = [5, 2, 6, 4, 1, 9, 3, 8, 7];
// sort array beginning at index 2; sort 4 elements of array
subSort(array, 2, 4, (a, b) => a - b);
// array is now [5, 2, 1, 4, 6, 9, 3, 8, 7]
subSort(array, 2, 4, (a, b) => b - a);
// array is now [5, 2, 9, 6, 4, 1, 3, 8, 7]

subSort()可用于任意复杂的对象。