在 JavaScript 中按字母顺序排序

2025年3月3日 | 阅读 11 分钟

排序是根据某些标准来呈现元素顺序的方式。在 JavaScript 中,数组的元素会被排序,这些元素可以是字符串或数字。排序使数据更易于访问,有助于搜索并实现快速搜索访问。

JavaScript 中的排序类型

  1. 字母排序: 这种排序类型根据字母顺序排列字符串,遵循从 'A' 到 'Z' 的顺序,或者我们可以说它是升序。这是最基本的排序方式,也是字符串或包含字符串的数组最常用的排序方式。
  2. 数值排序: 根据其数值(根据需要从最低或最高数字开始)对元素进行排序。这通常用于数字数组。
  3. 自定义排序: 自定义排序是一个简单的案例,用于确定元素的排序方式(降序排列或使用程序员定义的特定标准)。这包括按特定属性排序,或任何你能想到的比较函数。
  4. 稳定排序: 如果排序算法保持相等元素的相对顺序,则该算法被认为是稳定的。也就是说,两个具有相同值的元素在排序后在已排序数组中的位置与其在原始数组中的位置相同。此外,当在排序序列中保持相等元素的原始顺序时,稳定性很重要。

JavaScript 中的排序算法

JavaScript 有一个内置的数组排序函数 called sort()。该函数在 sort() 函数内部比较两个元素的值。默认的排序顺序是按照 Unicode 代码点进行的,但你可以配置一个自定义的 sort 函数来执行数值排序或任何其他类型的排序。JavaScript 提供了内置的 sort() 和 reverse() 函数,我们将同时使用它们并进行比较。

  1. 快速排序: 一种非常快速的分治算法,它根据给定的枢轴元素将数组划分为更小的子数组,然后重复对其进行排序。
  2. 归并排序: 一种分治算法,它将数组分成两半,对每一半进行排序,然后将它们合并。
  3. 冒泡排序: 这是一种简单的基于比较的算法,通过将整个列表进行多次遍历,比较相邻的元素,并在它们位置错误时交换它们。
  4. 插入排序: 这是一个算法,它一次构建最终的排序数组(或列表),直到没有更多未排序的项为止,将它们插入到正确的位置。
  5. 选择排序: 一种原地比较排序算法,它将输入列表分为两部分:已排序元素的子数组和未排序元素的子数组。它不断地从未排序的子数组中选择最小的元素,并将其移到已排序的子数组中。

使用 sort() 方法

在 JavaScript 中,使用 sort() 方法对数组进行字母排序非常简单,该方法返回排序后的数组,其中包含原始值。

代码

输出

Sort Alphabetically in JavaScript

默认情况下,sort() 方法将元素作为字符串进行字母升序排序。但这种默认行为可能并不总是能得到预期的结果,例如在排序数字或非 ASCII 字符时。

要对数字数组进行排序,你需要为 sort() 方法提供一个比较函数。

代码

输出

Sort Alphabetically in JavaScript

同样,对于对非 ASCII 字符或具有特定要求的字符串进行排序,你可以定义一个自定义的比较函数。

代码

输出

Sort Alphabetically in JavaScript

按属性对对象进行排序

如果你正在处理一个对象数组,有时我们需要根据某个属性对对象进行排序。这可以通过使用 sort() 函数以及自定义的比较方法来完成。

代码

输出

Sort Alphabetically in JavaScript

性能考虑

sort() 方法是一个方便且广泛使用的功能,但当涉及到大量数据的性能时,我们在此函数上使用的形状将至关重要。默认的 sort() 比较函数在平均情况下可能具有 O(n log n) 的时间复杂度。但是,对于复杂的比较函数或某些数据类型,性能可能会降低。

在性能至关重要的场景中,例如对大型数据集进行排序或在实时应用程序中执行频繁排序,像归并排序或快速排序这样的替代排序算法可能更合适。像 Lodash 这样的提供优化的排序函数(_.sortBy()),与原生的 sort() 方法相比,它提供了更好的性能和灵活性。

不区分大小写的排序

如果你确实打算在忽略大小写的情况下按字母顺序对字符串进行排序,有时。在 JavaScript 中,localeCompare() 方法通过将 sensitivity 设置为 'base' 来提供执行不区分大小写排序的选项。

代码

输出

Sort Alphabetically in JavaScript

处理重复项

在排序包含重复元素的数组时,默认的 sort() 行为是通过确保稳定排序来维持此顺序。如果你想对重复项进行排序,其中一个顺序可以被认为是“更高”或另一个是“较低”,请相应地调整你的比较函数。

代码

输出

Sort Alphabetically in JavaScript

稳定性排序

如果排序算法保持相等元素的相对顺序不变,则称该排序算法是稳定的。当实现它的排序算法是稳定的时,JavaScript sort() 保证了稳定性。请注意,并非所有 JavaScript 引擎都实现了稳定的排序,因此利用此特性在不同环境中获益可能被认为是有风险的。

如果你的应用程序需要稳定性,请使用库或自行实现稳定的排序算法。

按多个标准排序

然而,在实际场景中,你可能会遇到仅按一个标准排序不够的情况。可以采用不同的方式来实现按多个元素排序——例如,先按名称排序,然后按年龄级别进行子排序。

要做到这一点,我们将创建一个比较函数,该函数考虑每个标准并按正确的顺序进行加权。

代码

输出

Sort Alphabetically in JavaScript

用于高级排序的外部库

JavaScript 中有各种排序方法,例如在上一篇文章中已经介绍过的 sort 和 reverse 等常用方法。在这里,我们将更深入地研究外部库,以实现更高级的排序。Lodash、Underscore.com 和 Ramda 等概念提供了使用自定义比较器对数组进行排序的能力,以及其他各种功能。

代码

输出

Sort Alphabetically in JavaScript

高级排序技术

1. 自定义排序标准

字母排序很容易,有时你需要根据自定义行为应用排序。JavaScript 提供了一个 sort() 方法,允许你编写自定义比较函数来处理这些要求。

想象一下有一个对象数组,例如具有 name 和 price 两个属性的产品,你想按价格降序对其进行排序。

代码

输出

Sort Alphabetically in JavaScript

2. 处理 null 和 undefined 值

在排序包含 null 或 undefined 的数组时,我们会遇到一些陷阱。排序时,undefined 值将被推到已排序数组的末尾,而 null 则作为实际字符串优先。

你有机会为处理 null 和 undefined 值的各种情况提供更好的比较。

代码

输出

Sort Alphabetically in JavaScript

3. 链式排序标准

有时你可能需要按多个(多于一个)数据标准进行排序。在 JavaScript 中,你可以使用 sort() 的最后一个参数的第一个参数来排序多个比较函数。

给定一个表示学生的对象数组,具有 name 和 age 属性,我们需要先按 age 属性进行排序,如果两个 age 相同,则使用另一个属性,例如 name。

代码

输出

Sort Alphabetically in JavaScript

JavaScript 中字母排序的优点

  1. 易于使用: 使用 JavaScript 内置的 sort() 方法,只需简短的代码即可轻松实现字母排序。快速对字符串数组进行排序,无需编写复杂的排序逻辑。
  2. 对小数据集的效率: 这确保了 filter() 发送器不会为数组中的每个元素进行评估,从而提高了这些简单情况或处理小型数组时的效率。平均而言,它具有 O(n log n) 的时间复杂度,这对于大多数小型到中型数组的使用场景都适用。
  3. 默认行为: 默认情况下,JavaScript 的 sort() 方法将元素作为字符串排序,这对于大多数常见用例来说是可以的。如果我们只想按字母顺序对字符串进行排序,则无需定义比较函数。
  4. 自定义比较函数的灵活性: Sort() 方法可以接受自定义比较函数,从而允许更复杂的排序逻辑。这非常强大,因为你可以根据独特的需求进行排序,例如不区分大小写的排序或仅按某个对象属性进行排序。
  5. 原地排序: JavaScript 的 sort() 方法是原地排序数组,这意味着原始数组会直接被修改。这在内存方面是高效的,尤其是对于大型数组,因为创建数组的副本会占用额外的内存。

JavaScript 中字母排序的缺点

  1. 对数字数据排序不直观: 如果在没有传递自定义比较函数的情况下对数字数组使用 sort() 方法,元素将被转换为字符串并按字典顺序排序。这会导致排序结果与逻辑或用户可读的顺序无关,尽管在包含混合数字和字符串的数组中情况更糟。
  2. 稳定性有限: JavaScript 的 sort() 方法不稳定,因此可能会出现相等元素之间的顺序发生变化的情况。然而,并非所有情况都需要稳定性,如果应用程序需要它们,可以实现其特定的稳定排序算法或一些额外的逻辑。
  3. 大型数据集潜在的性能问题: 假设 sort() 方法在小型或初始填充的数组中效率很高,但在非常大的数据集上可能会遇到性能问题。在这种情况下,替代排序算法或优化的库可以提供更好的性能。
  4. 区域设置特定排序的默认行为: 默认情况下,JavaScript sort() 方法按字母顺序排序字符串,但不一定以符合区域设置特定排序的方式进行。这可能需要开发人员编写自定义比较函数或使用第三方库进行区域敏感排序。
  5. 排序对象的复杂性: 由于对象元素是对象,因此提供比较函数的功能变得必不可少。虽然这提供了灵活性,但它也使排序过程复杂化,并且对于深度嵌套或分层对象结构来说更加复杂。

JavaScript 中字母排序的应用

  1. 用户界面组件: 在下拉菜单、列表视图和表格等用户界面组件中,这是一种非常常见的操作。例如,当你对国家或城市列表进行排序时,用户可以快速找到项目,从而提高可用性。
  2. 搜索和过滤: 任何带有搜索和过滤功能的应用程序,字母排序将使用户体验更好,以结构化的顺序显示大量输出,以便可以通过搜索结果或选项进行查找。这使用户能够快速找到他们所需的信息。
  3. 目录列表: 目录或文件浏览器是字母排序的示例,用于组织文件和文件夹,通常按字母顺序排序。它使用户能够快速浏览目录并找到所需的文件或文件夹。
  4. 联系人列表: 联系人列表通常使用姓名进行命名,这些列表由移动应用程序(如 Contacts、WhatsApp 等)创建。这反过来有助于用户快速找到他们的联系人,尤其是当他们拥有大量联系人时。
  5. 产品目录: 如果我们谈论电子商务网站和应用程序,它们会按字母顺序映射其产品目录。购物者通常可以按字母顺序浏览产品,当产品按名称在页面上排序时,可以轻松方便地找到它们。
  6. 字母索引: 要生成内容的字母索引,需要进行字母排序,该排序在实现之间必须一致,并且可以由计算机进行排序。这些索引充当快速查找信息的便捷标记,并提供参考点。
  7. 自动完成和建议: 在自动完成功能中,当用户输入时,会向他们显示相关选项列表;选项列表会应用字母排序。这有助于用户快速轻松地输入。
  8. 语言和本地化: 多语言应用程序需要根据语言按字母顺序显示其内容,以正确展示本地化信息。这保证了翻译在所有语言版本中都能正常工作。
  9. 播放列表管理: 音乐流媒体服务和媒体播放器按歌曲标题或艺术家姓名确定的顺序排列收藏。这有助于用户管理和浏览他们的播放列表。
  10. 文档管理: 要归档记录,文件通常按字母顺序分类,并以它们适用的文档命名。这使得在系统中查找和管理文档更加容易。

结论

对于任何经常处理 JavaScript 中纯文本数组的开发人员来说,排序数据都是一项基本技能。通过学习不同的排序方法、边缘情况以及采用排序顺序的定制,您可以在处理 JavaScript 应用程序时高效地处理数据。

JavaScript 配备了一些强大的工具和方法,可以帮助您快速对简单的字符串数组或包含对象的更复杂的数组进行排序。通过尝试不同的方法和排序风格来练习以最佳方式排序数据。