JavaScript 数组 sort()

sort() 方法按特定顺序(升序或降序)对数组项进行排序。

示例

let city = ["California", "Barcelona", "Paris", "Kathmandu"];

// sort the city array in ascending order let sortedArray = city.sort();
console.log(sortedArray); // Output: [ 'Barcelona', 'California', 'Kathmandu', 'Paris' ]

sort() 语法

sort() 方法的语法是

arr.sort(compareFunction)

这里,arr 是一个数组。


sort() 参数

sort() 方法接受

  • compareFunction (可选) - 用于定义自定义排序顺序。

sort() 返回值

  • 返回已排序的数组(原地排序,即更改原始数组,不创建副本)。

示例 1:对数组元素进行排序

当未传递 compareFunction 时,

  • 所有非undefined的数组元素首先被转换为字符串
  • 然后使用它们的 UTF-16 代码单元值对这些字符串进行比较。
  • 排序按升序进行。
  • 所有 undefined 元素将被排序到数组的末尾。
// sorting an array of strings
var names = ["Adam", "Jeffrey", "Fabiano", "Danil", "Ben"];

// returns the sorted array console.log(names.sort());
// modifies the array in place console.log(names); var priceList = [1000, 50, 2, 7, 14];
priceList.sort();
// Number is converted to string and sorted console.log(priceList)

输出

[ 'Adam', 'Ben', 'Danil', 'Fabiano', 'Jeffrey' ]
[ 'Adam', 'Ben', 'Danil', 'Fabiano', 'Jeffrey' ]
[ 1000, 14, 2, 50, 7 ]

这里,我们可以看到 names 数组是按字符串升序排序的。例如,Adam 排在 Danil 之前,因为 "A" 排在 "D" 之前。

由于所有非 undefined 元素在排序前都会被转换为字符串,因此 Number 数据类型会按该顺序排序。

这里,我们可以看到即使 1000 在数值上大于 50,它也排在排序列表的开头。这是因为 "1" < "5"


示例 2:使用自定义函数进行排序

当传递 compareFunction 时,

  • 所有非undefined的数组元素将根据 compareFunction 的返回值进行排序。
  • 所有 undefined 元素都将被排序到数组的末尾,并且不会为它们调用 compareFunction

假设我们想对上面的 names 数组进行排序,以便最长的名字排在最后,而不是按字母顺序排序。我们可以按以下方式进行:

// custom sorting an array of strings
var names = ["Adam", "Jeffrey", "Fabiano", "Danil", "Ben"];

function len_compare(a, b){
    return a.length - b.length;
}

// sort according to string length
names.sort(len_compare);
console.log(names);

输出

[ 'Ben', 'Adam', 'Danil', 'Jeffrey', 'Fabiano' ]

这里,排序基于逻辑 a.length - b.length。这基本上意味着长度较短的项将出现在 Array 的开头。

让我们先了解可选的 compareFunction 是如何工作的。

任何 compareFunction 都具有以下语法

function (a, b){
    // sorting logic
    // return a Number 
}

sort() 方法通过一次将两个值传递给 compareFunction 来比较数组的所有值。ab 参数分别代表这两个值。

compareFunction 应返回一个 Number。返回的值用于按以下方式对元素进行排序:

  • 如果 **返回值为 < 0**,则 a 排在 b 之前(ab 之前)。
  • 如果 **返回值为 > 0**,则 b 排在 a 之前(ba 之前)。
  • 如果 **返回值为 == 0**,则 ab 之间的相对位置保持不变。

在示例 2 中,我们使用以下方法对数组进行排序:

function len_compare(a, b){
    return a.length - b.length;
}

这里

  • 如果 **a.length - b.length < 0**,则 a 排在 b 之前。例如,Adam 排在 Jeffrey 之前,因为 4 - 7 < 0
  • 如果 **a.length - b.length > 0**,则 b 排在 a 之前。例如,Danil 排在 Ben 之后,因为 5 - 3 > 0
  • 如果 **a.length - b.length == 0**,则它们的相对位置不变。例如,JeffreyFabiano 的相对位置不变,因为 7 - 7 == 0

我们可以看到,这会导致字符串根据其长度按升序排序。


示例 3:按数字顺序对数字进行排序

由于所有非 undefined 元素在排序前都会被转换为字符串,因此我们无法默认按数值顺序对数字进行排序。

让我们看看如何使用自定义函数来实现这一点。

// numeric sorting

// define array
var priceList = [1000, 50, 2, 7, 14];

// sort() using function expression
// ascending order
priceList.sort(function (a, b) { return a - b; });
// Output: Ascending - 2,7,14,50,1000 console.log("Ascending - " + priceList); // sort() using arrow function expression // descending order
priceList.sort((a, b) => b - a);
// Output: Descending - 1000,50,14,7,2 console.log("Descending - " + priceList);

输出

Ascending - 2,7,14,50,1000
Descending - 1000,50,14,7,2

在此示例中,我们使用以下方法对数组进行排序:

function (a, b) {
  return a - b;
}

这里,

  • 如果 **a - b < 0**,则 a 排在 b 之前。例如,2 排在 7 之前,因为 2 - 7 < 0
  • 如果 **a - b > 0**,则 b 排在 a 之前。例如,1000 排在 50 之后,因为 1000 - 50 > 0

我们可以看到,这会导致数字按升序进行排序。

类似地,我们可以使用 b - a 来按降序排序。请注意,我们也可以使用 ES2015 中定义的箭头函数表达式。

我们还可以使用内置的数组 reverse() 方法来反转(降序)已排序的数组。要了解更多信息,请访问JavaScript Array reverse()


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战