ZetCode

JavaScript sort 方法

最后修改于 2025 年 4 月 4 日

在本文中,我们展示了如何使用 JavaScript 中的 sort 方法对数组进行排序。

数组排序

sort 方法对数组的元素进行原地排序,并返回已排序的数组。 默认情况下,它将元素转换为字符串并比较它们的 UTF-16 代码单元值。 这意味着默认情况下,数字不会按数值排序。

该方法接受一个可选的比较函数,用于定义排序顺序。 该函数应根据参数返回负值、零或正值。 使用 sort 方法时,原始数组会被修改。

对于简单的字符串数组,默认排序效果很好。 对于数字或复杂对象,通常需要一个比较函数。 在现代 JavaScript 引擎中,排序是稳定的,这意味着相等的元素会保留其原始顺序。

基本字符串排序

以下示例演示了使用字符串的默认排序行为。

main.js
const fruits = ['banana', 'apple', 'orange', 'pear'];
fruits.sort();

console.log(fruits);

我们创建一个水果数组,并按字母顺序对它们进行排序。 默认排序将元素转换为字符串并进行比较。 原始数组会被修改。

$ node main.js
[ 'apple', 'banana', 'orange', 'pear' ]

数字排序

默认排序不适用于数字,因为它将它们作为字符串进行比较。

main.js
const numbers = [10, 5, 100, 2, 1000];
numbers.sort();

console.log(numbers);

如果没有比较函数,数字将被转换为字符串并按字典顺序进行比较。 这会导致 '100' 排在 '2' 之前,因为在字符串比较中 '1' 小于 '2'。

$ node main.js
[ 10, 100, 1000, 2, 5 ]

使用比较函数对数字进行排序

为了正确地对数字进行排序,我们需要提供一个比较函数。

main.js
const numbers = [10, 5, 100, 2, 1000];
numbers.sort((a, b) => a - b);

console.log(numbers);

比较函数从 a 中减去 b。 如果结果为负数,则 a 在 b 之前。 如果为正数,则 b 在 a 之前。 如果为零,它们的顺序保持不变。 这将数字按升序排序。

$ node main.js
[ 2, 5, 10, 100, 1000 ]

按属性对对象进行排序

我们可以通过比较对象的属性来对对象数组进行排序。

main.js
const users = [
  { name: 'John', age: 30 },
  { name: 'Jane', age: 25 },
  { name: 'Bob', age: 35 }
];

users.sort((a, b) => a.age - b.age);
console.log(users);

我们根据用户对象的年龄属性对它们进行排序。 比较函数减去年龄以确定顺序。 这将用户从最年轻到最年长进行排序。

$ node main.js
[
  { name: 'Jane', age: 25 },
  { name: 'John', age: 30 },
  { name: 'Bob', age: 35 }
]

不区分大小写的字符串排序

为了进行不区分大小写的字符串排序,我们需要一个自定义比较函数。

main.js
const words = ['apple', 'Banana', 'cherry', 'Date'];
words.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));

console.log(words);

我们使用 localeCompare,并将 sensitivity 设置为 'base' 以进行不区分大小写的比较。 这将大写和小写字母视为相等。 排序顺序现在真正地按字母顺序排列,而不考虑大小写。

$ node main.js
[ 'apple', 'Banana', 'cherry', 'Date' ]

来源

数组排序 - 语言参考

在本文中,我们演示了如何使用 sort() 方法在 JavaScript 中对数组进行排序。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 JS 数组函数。