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

13

我有一个数组,想要对除了最后n个元素以外的所有元素进行排序。

例如,如果数组长度为10,则希望将0到7号元素进行排序,同时保留8-9号元素的位置不变。

5个回答

19
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]

7
这将创建一个新的数组,不会改变原来的数组。因此,如果原来的数组在其他地方被引用,它将不会被排序。 - Tim Down

10
如果你需要原地对数组进行排序(即不创建新的已排序数组),可以使用 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);

4
一个基于@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() 可以用于任意复杂度的对象。


1
let arr = [2, 1, 5, 4, 3];
arr = [...arr.slice(0, 2), ...arr.slice(2).sort((a, b) => a - b)];

在对子数组进行排序后,原始数组将变为[2, 1, 3, 4, 5]。

0

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]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接