跳转到主要内容
模块 6 · 第 4 课(共 4)课程中的24/32~12 min
模块课程(4/4)

排序

在 JavaScript 中对数组进行排序有一个很大的陷阱:sort() 改变原始数组 并且默认情况下按字符串排序。

陷阱

JS
const nums = [10, 2, 1, 20];
nums.sort();
// [1, 10, 2, 20]   ← !? sorted as strings: "1" < "10" < "2"

对于数字排序,您必须传递 比较器 (a, b) => number:

  • a - b < 0 → a 首先
  • a - b > 0 → b 首先
  • a - b === 0 → 顺序不变
JS
const nums = [10, 2, 1, 20];
nums.sort((a, b) => a - b);
// [1, 2, 10, 20]    ← ascending order

nums.sort((a, b) => b - a);
// [20, 10, 2, 1]    ← descending

按字段对对象进行排序

JS
const utenti = [
  { nome: 'Anna', eta: 30 },
  { nome: 'Luca', eta: 12 },
  { nome: 'Sara', eta: 18 },
];

utenti.sort((a, b) => a.eta - b.eta);
// [{Luca,12}, {Sara,18}, {Anna,30}]

对于字符串,您可以将它们与 localeCompare 进行比较:

JS
const nomi = ['Bruno', 'aurora', 'Carlo'];
nomi.sort((a, b) => a.localeCompare(b));
// ['aurora', 'Bruno', 'Carlo']

不改变原来的

两种选择:

JS
// 1) copy + sort
const copia = [...nums].sort((a, b) => a - b);

// 2) toSorted (modern, ES2023)
const ordinati = nums.toSorted((a, b) => a - b);

尝试一下

锻炼#js.m6.l4.e1
尝试:0加载中...

定义“sortAscending(nums)”:返回数组的新副本,按数字升序排序。原件不得更改。

正在加载编辑器...
显示提示

[...nums].sort((a, b) => a - b)

3 次尝试后可用的解决方案

复习练习

锻炼#js.m6.l4.e2
尝试:0加载中...

定义“sortByAgeAscending(people)”:给定一个 { name,age } 数组,返回按年龄升序排序的新副本。原件不得更改。

正在加载编辑器...
显示提示

[...人].sort((a, b) => a.age - b.age)

3 次尝试后可用的解决方案