Thứ sáu, 04/09/2020 | 00:00 GMT+7

Sử dụng phương pháp sắp xếp của JavaScript để sắp xếp các mảng số


Phương thức sort có sẵn trên nguyên mẫu Mảng cho phép bạn sắp xếp các phần tử của một mảng và kiểm soát cách sắp xếp nên được thực hiện. Mục đích của bài đăng này là giải thích cho bạn tại sao, tại sao không và cách thức hoạt động của phương pháp sort khi sắp xếp một mảng số .

TL; DR - Sắp xếp một mảng số theo thứ tự tăng dần bằng cách sử dụng:
myArray.sort((a, b) => a - b);

Mảng trong JavaScript là cấu trúc dữ liệu bao gồm một tập hợp các mục dữ liệu. Bởi vì Javascript không phải là một ngôn ngữ định kiểu, các mảng Javascript có thể chứa các loại phần tử khác nhau - chuỗi , số , không xác định , v.v. Tuy nhiên, thông thường tốt nhất là tất cả các mục trong một mảng có cùng loại.

Một trong nhiều thao tác có thể được thực hiện trên một mảng là sắp xếp . Cho dù bạn cần biết những học sinh giỏi nhất từ một bộ sưu tập điểm, những người chiến thắng lớn của Phố Wall, lượng dữ liệu bạn đã tiêu thụ gần đây, tất cả đều liên quan đến việc tổ chức một bộ sưu tập thông qua phân loại.

Trong các ví dụ mã bên dưới. Ta sẽ lấy một bộ sưu tập trứng trong tổ của bạn , sau đó sắp xếp chúng theo thứ tự tăng dần và giảm dần. Sẵn sàng? Hãy làm nó!

Điền vào một mảng

Ta khai báo và khởi tạo một mảng nest và điền trước nó bằng các giá trị null - hiện tại:

let eggsInNest = new Array(10).fill(null);

Ta sử dụng phương thức điền tĩnh có sẵn trên phương thức khởi tạo Array . Tiếp theo, hãy điền vào 10 phần tử mỗi phần với các giá trị ngẫu nhiên khác nhau, từ 1 - 200:

eggsInNest = eggsInNest.map(() => (Math.floor(Math.random() * 200) + 1));

Sắp xếp

Sau đó, ta có thể sắp xếp đơn giản bằng cách gọi phương thức sort trên mảng của ta mà không có đối số:

eggsInNest.sort();

// e.g.: [109, 136, 156, 188, 19, 190, 2, 34, 55, 90]

Như bạn thấy , có một vấn đề nhỏ và việc sắp xếp không hoàn toàn diễn ra như bạn có thể mong đợi. Đọc tiếp để tìm hiểu lý do và cách khắc phục.

Theo mặc định, phương thức sort() sắp xếp mảng:

  1. Theo thứ tự tăng dần
  2. Với các mục được đúc thành chuỗi

Để làm điều này, phương thức sort gọi phương thức ép kiểu String() trên mọi phần tử của mảng và sau đó so sánh các chuỗi tương đương để xác định thứ tự đúng.

Nó sẽ dễ dàng như vậy, ngoại trừ thực tế là các mục được so sánh dưới dạng chuỗi, có các mục được sắp xếp như thể chúng là chuỗi ký tự thay vì số. Tóm lại, hầu hết các trường hợp, sử dụng phương thức sort mà không có phương thức gọi lại không hoàn toàn hiệu quả, bởi vì sort không sắp xếp theo cách ta mong đợi. Thay vào đó, nó cần được chỉ dẫn rõ ràng về cách làm như vậy - với một hàm gọi lại .

Hàm gọi lại hoặc, về mặt kỹ thuật, hàm so sánh nhận hai đối số (được gọi là ab theo quy ước) và sẽ trả về 1 nếu đối số đầu tiên đứng trước đối số thứ hai, -1 nếu đối số thứ hai phải đứng trước đối số thứ nhất và 0 nếu chúng bằng nhau. Chà! 😓


Hãy tạo một sortEggsInNest so sánh sortEggsInNest :

function sortEggsInNest(a, b) {
  if (a > b) {
    return 1;
  } else if (b > a) {
    return -1;
  } else {
    return 0;
  }
}

Nếu bạn muốn trở thành một hotshot 😎, bạn có thể giảm hàm so sánh sortEggsInNest bằng một toán tử bậc ba như sau:

function sortEggsInNest(a, b) {
  return a > b ? 1 : b > a ? -1 : 0;
}

Sau đó, ta có thể gọi lại phương thức sort nhưng lần này truyền vào hàm so sánh sortEggsInNest :

eggsInNest.sort(sortEggsInNest);

Và vâng, nó hoạt động… theo thứ tự tăng dần.

Thứ tự giảm dần

Cần sắp xếp theo thứ tự giảm dần? Chỉ cần swap trả về 1 trong hàm so sánh với trả về -1 như sau:

function sortEggsInNest(a, b) {
  if (a > b) {
    return -1;;
  } else if (b > a) {
    return 1;;
  } else {
    return 0;
  }
}

Hoặc, version ngắn sử dụng toán tử bậc ba:

function sortEggsInNest(a, b) {
  return a > b ? -1 : b > a ? 1 : 0;
}

Một cách ngắn hơn với các con số

Cuối cùng, thậm chí còn có một cách ngắn hơn để viết hàm so sánh. Đây:

eggsInNest.sort((a, b) => a - b);

Đây chỉ là Ok vì hàm so sánh chỉ trả về 1, -1 hoặc 0 . và trừ hai giá trị trung gian sẽ thu được chính xác giá trị đó. Tuy nhiên, hãy nhớ rằng - điều này chỉ được dùng với các kiểu số hoặc đối tượng có valueOf() trả về giá trị số (chẳng hạn như đối tượng Date).

Đọc thêm

sort là một trong nhiều phương thức Array Mutator cùng với shift , splice , reverse và các phương thức khác. Để biết thêm thông tin về tất cả các phương pháp, hãy xem Cách sử dụng phương thức mảng trong JavaScript: Phương thức đột biến


Tags:

Các tin liên quan