我有一个数组,并希望对除最后n个元素之外的所有元素进行排序。
例如,如果数组长度为10个元素,则希望对元素0到7进行排序,同时保留元素8-9。
答案 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));
因此可以对数组中的范围进行排序:
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()可用于任意复杂的对象。