Chuyển đến nội dung chính
Mô-đun 6 · Bài học 4 trong tổng số 424/32 trong khóa học~12 min
Bài học theo mô-đun (4/4)

sắp xếp

Việc sắp xếp một mảng trong JavaScript có một cái bẫy lớn: sort() làm thay đổi mảng ban đầu và theo mặc định sắp xếp dưới dạng chuỗi.

Cái bẫy

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

Để sắp xếp theo số, bạn phải chuyển bộ so sánh (a, b) => number:

  • a - b < 0 → a đến trước
  • a - b > 0 → b đến trước
  • a - b === 0 → đơn hàng không thay đổi
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

Sắp xếp đối tượng theo trường

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}]

Đối với chuỗi, bạn có thể so sánh chúng với localeCompare:

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

Không làm thay đổi bản gốc

Hai lựa chọn:

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

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

Hãy thử nó

tập thể dục#js.m6.l4.e1
Nỗ lực: 0Đang tải…

Xác định `sortAscending(nums)`: trả về một bản sao MỚI của mảng, được sắp xếp theo thứ tự tăng dần dưới dạng số. Bản gốc không được thay đổi.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

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

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#js.m6.l4.e2
Nỗ lực: 0Đang tải…

Xác định `sortByAgeAscending(people)`: cho một mảng { name, age }, trả về một bản sao mới được sắp xếp theo độ tuổi tăng dần. Bản gốc không được thay đổi.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

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

Giải pháp khả dụng sau 3 lần thử