Array.prototype.sort()

sort() 方法就地对数组的元素进行排序并返回排序后的数组。 默认排序顺序是升序,建立在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列的基础上。

排序的时间和空间复杂度无法保证,因为它取决于实现。


使用 sort 方法按字母顺序给数组排序

sort 方法可以根据回调函数对数组元素进行排序。

1
2
3
4
5
6
7
8

function ascendingOrder(arr) {
  return arr.sort(function(a, b) {
    return a - b;
  });
}

ascendingOrder([1, 5, 2, 3, 4]); // [1, 2, 3, 4, 5]
1
2
3
4
5
6
7
8

function reverseAlpha(arr) {
  return arr.sort(function(a, b) {
    return a === b ? 0 : a < b ? 1 : -1;
  });
}

reverseAlpha(['l', 'h', 'z', 'b', 's']); // ['z', 's', 'l', 'h', 'b']

JavaScript 的默认排序方法是 Unicode 值顺序排序,有时可能会得到意想不到的结果。

因此,建议提供一个回调函数来指定如何对数组项目排序。

这个回调函数通常叫做 compareFunction,它根据 compareFunction 的返回值决定数组元素的排序方式:

  • 如果两个元素 a 和 b,compareFunction(a,b) 返回一个比 0 小的值,那么 a 会在 b 的前面。

  • 如果两个元素 a 和 b,compareFunction(a,b) 返回一个比 0 大的值,那么 b 会在 a 的前面。

  • 如果两个元素 a 和 b,compareFunction(a,b) 返回等于 0 的值,那么 a 和 b 的位置保持不变。


在 alphabeticalOrder 函数中使用 sort 方法对 arr 中的元素按照字母顺序排列。 该函数应返回一个排序的数组。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

function alphabeticalOrder(arr) {

  return arr.sort(function (a, b) {
    return a === b ? 0 : a < b ? -1 : 1;
  });

}

alphabeticalOrder(["a", "d", "c", "a", "z", "g"]); // [ 'a', 'a', 'c', 'd', 'g', 'z' ]

在不更改原始数组的前提下返回排序后的数组

sort 方法会产生改变原始数组中元素顺序的副作用。

换句话说,它会改变数组的位置。

避免这种情况的一种方法是先将空数组连接到正在排序的数组上(记住 slice 和 concat 返回一个新数组),再用sort方法。

在 nonMutatingSort 函数中使用 sort 方法对数组中的元素按升序进行排列。 函数不能改变 globalArray 变量,应返回一个新数组。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

const globalArray = [5, 6, 3, 2, 9];

function nonMutatingSort(arr) {

  return [].concat(arr).sort(function (a, b) {
    return a - b;
  });

}

nonMutatingSort(globalArray); // [ 2, 3, 5, 6, 9 ]
console.log(globalArray); // [ 5, 6, 3, 2, 9 ]