我有一个数组,想要对除了最后n个元素以外的所有元素进行排序。
例如,如果数组长度为10,则希望将0到7号元素进行排序,同时保留8-9号元素的位置不变。
我有一个数组,想要对除了最后n个元素以外的所有元素进行排序。
例如,如果数组长度为10,则希望将0到7号元素进行排序,同时保留8-9号元素的位置不变。
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]
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);
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() 可以用于任意复杂度的对象。
let arr = [2, 1, 5, 4, 3];
arr = [...arr.slice(0, 2), ...arr.slice(2).sort((a, b) => a - b)];
splice
可以用来删除数组的一部分并插入排序后的数组的部分:
const a = [9,8,7,6,5,4,3,2,1];
a.splice(3, 3, ...a.slice(3, 6).sort());
console.log( JSON.stringify( a ) ); // [9,8,7,4,5,6,3,2,1]