Javascript Array Sort

21/07/2019

Bài sau » « Bài trước

Sorting Array

Phương thức sort() dùng để sắp xếp các phần tử trong Array theo thứ tự A-Z.

var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Kết quả là: Apple,Banana,Mango,Orange

Phương thức reverse() dùng để đảo ngược phần tử trong Array.

Bạn có thể kết hợp phương thức này với phương thức sort() để sắp xếp phần tử theo thứ tự giảm dần từ Z-A

var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Kết quả là: Apple,Banana,Mango,Orange fruits.reverse(); // Kết quả là: Orange,Mango,Banana,Apple

Numberic Sort

Theo mặc định, function sort() dùng để sắp xếp giá trị như là strings.

Nó hoạt động tốt đối với string như trường hợp "Apple" nằm trước "Banana".

Tuy nhiên, nếu Number mà sort như String, thì đối với trường hợp "25" với "100" thì kết quả sẽ sai ("25" > "100" vì "2" lớn hơn "1").

Để giải quyết trường hợp trên, khi sort Number ta phải truyền thêm function so sánh:

var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return a - b}); // Kết quả là: 1,5,10,25,40,100

Để sắp xếp theo thứ tự giảm dần ta sửa lại như sau:

var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return b - a}); // Kết quả là: 100,40,25,10,5,1

Function so sánh

Mục đích của function so sánh là xác định thứ tự sắp xếp. Kết quả trả về của function này là: giá trị âm, 0, giá trị dương phụ thuộc vào 2 tham số truyền vào.

function(a, b){return a - b}

Khi function sort() hoạt động, 2 giá trị sẽ được truyền vào function so sánh và dựa vào kết quả trả về để sắp xếp lại vị trí các phần tử:

- Nếu giá trị trả về là âm: Khi đó a sẽ nằm trước b.

- Nếu giá trị trả về là dương: Khi đó a sẽ nằm sau b.

- Nếu giá trị trả về là 0: Khi đó a = b và vị trí không thay đổi.

Sort Array với giá trị Random

Ta sử dụng hàm toán học Math.random() để tạo giá trị ngẫu nhiên (0.1 - 0.9)

var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return 0.5 - Math.random()});

Tìm giá trị lớn nhất, nhỏ nhất trong Array

Không có function nào được xây dựng sẵn cho việc tìm giá trị lớn nhất, nhỏ nhất trong Array.

Tuy nhiên, Bạn có thể tìm được nó sau khi sử dụng function sort(), Giá trị nằm ở vị trí 0 là nhỏ nhất, giá trị nằm ở vị trí length - 1 là lớn nhất.

var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return a - b}); // Kết quả là: 1,5,10,25,40,100 var find_min = points[0]; // Lấy giá trị nhỏ nhất var find_max = points[points.length - 1]; // Lấy giá trị lớn nhất

Sắp xếp 1 mảng là phương pháp kém hiệu quả cho việc chỉ để tìm giá trị lớn nhất hoặc nhỏ nhất.

Sử dụng Math.max()

Ta có thể xây dựng 1 function sử dụng function có sẵn là Math.max.apply.

var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = myArrayMax(points); // Kết quả là : 100 function myArrayMax(arr) { return Math.max.apply(null, arr); }

Math.max.apply(null, [1, 2, 3]) tương đương với Math.max(1, 2, 3).

Sử dụng Math.min()

Ta có thể xây dựng 1 function sử dụng function có sẵn là Math.min.apply.

var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = myArrayMax(points); // Kết quả là : 1 function myArrayMax(arr) { return Math.min.apply(null, arr); }

Math.min.apply(null, [1, 2, 3]) tương đương với Math.min(1, 2, 3).

Tự xây dựng function tìm giá trị lớn nhất, nhỏ nhất

Giải pháp nhanh nhất nữa là tự build riêng cho mình 1 function để tìm kiếm giá trị lớn nhất, nhỏ nhất. Xem 2 đoạn code ví dụ sau:

Function tìm giá trị lớn nhất.

function myArrayMax(arr) { var len = arr.length var max = -Infinity; while (len--) { if (arr[len] > max) { max = arr[len]; } } return max; }

Function tìm giá trị nhỏ nhất.

function myArrayMin(arr) { var len = arr.length var min = Infinity; while (len--) { if (arr[len] < min) { min = arr[len]; } } return min; }

Sorting Object Array

Javascript Array thường chứa object.

var cars = [ {type:"Volvo", year:2016}, {type:"Saab", year:2001}, {type:"BMW", year:2010} ];

Ngay cả khi các object có các thuộc tính của các kiểu dữ liệu khác nhau, phương thức sort() có thể được sử dụng để sắp xếp mảng.

Giải pháp là viết function so sánh để so sánh các giá trị trong thuộc tính :

cars.sort(function(a, b){return a.year - b.year});

So sánh các thuộc tính chuỗi phức tạp hơn một chút:

cars.sort(function(a, b){ var x = a.type.toLowerCase(); var y = b.type.toLowerCase(); if (x < y) {return -1;} if (x > y) {return 1;} return 0; });

Bài sau » « Bài trước
Back to top