Mảng sắp xếp JavaScript
Phương pháp sắp xếp mảng
Sắp xếp theo bảng chữ cáiSắp xếp mảng()Mảng đảo ngược () Mảng toSắp xếp() Mảng toReversed() Sắp xếp đối tượng Xem thêm:Phương pháp cơ bảnPhương pháp tìm kiếm Phương pháp lặp | Sắp xếp sốSắp xếp sốSắp xếp ngẫu nhiên Toán.min() Toán.max() Nhà làm Min() Max tự làm tại nhà() |
Sắp xếp một mảng
Phương thức sort()
sắp xếp một mảng theo thứ tự bảng chữ cái:
Đảo ngược một mảng
Phương thức reverse()
đảo ngược các phần tử trong một mảng:
Bằng cách kết hợp sort()
và reverse()
, bạn có thể sắp xếp một mảng theo thứ tự giảm dần:
Ví dụ
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();
Hãy tự mình thử »Phương thức toSorted() của mảng JavaScript
ES2023 đã thêm phương thức toSorted()
như một cách an toàn để sắp xếp một mảng mà không làm thay đổi mảng ban đầu.
Sự khác biệt giữa toSorted()
và sort()
là phương thức đầu tiên tạo ra một mảng mới, giữ nguyên mảng ban đầu, trong khi phương thức cuối cùng thay đổi mảng ban đầu.
Ví dụ
const months = ["Jan", "Feb", "Mar", "Apr"];
const sorted = months.toSorted();
Hãy tự mình thử »Phương thức toReversed() của mảng JavaScript
ES2023 đã thêm phương thức toReversed()
như một cách an toàn để đảo ngược một mảng mà không làm thay đổi mảng ban đầu.
Sự khác biệt giữa toReversed()
và reverse()
là phương thức đầu tiên tạo ra một mảng mới, giữ nguyên mảng ban đầu, trong khi phương thức cuối cùng thay đổi mảng ban đầu.
Ví dụ
const months = ["Jan", "Feb", "Mar", "Apr"];
const reversed = months.toReversed();
Hãy tự mình thử »Sắp xếp số
Theo mặc định, sort()
sắp xếp các giá trị dưới dạng chuỗi .
Điều này hoạt động tốt đối với các chuỗi ("Apple" xuất hiện trước "Banana").
Nếu các số được sắp xếp dưới dạng chuỗi thì "25" lớn hơn "100" vì "2" lớn hơn "1".
Vì điều này, phương thức sort()
sẽ cho ra kết quả không chính xác khi sắp xếp các số.
Bạn có thể khắc phục điều này bằng cách cung cấp chức năng so sánh :
Ví dụ
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
Hãy tự mình thử »Sử dụng thủ thuật tương tự để sắp xếp một mảng giảm dần:
Ví dụ
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
Hãy tự mình thử » Chức năng so sánh
Mục đích của hàm so sánh là xác định thứ tự sắp xếp thay thế.
Hàm so sánh sẽ trả về giá trị âm, 0 hoặc dương, tùy thuộc vào các đối số:
function(a, b){return a - b}
Khi hàm sort()
so sánh hai giá trị, nó sẽ gửi các giá trị đến hàm so sánh và sắp xếp các giá trị theo giá trị được trả về (âm, 0, dương).
Nếu kết quả âm tính, a
sẽ được sắp xếp trước b
.
Nếu kết quả là dương thì b
được sắp xếp trước a
.
Nếu kết quả là 0 thì không có thay đổi nào được thực hiện với thứ tự sắp xếp của hai giá trị.
Ví dụ:
Hàm so sánh so sánh tất cả các giá trị trong mảng, hai giá trị cùng một lúc (a, b)
.
Khi so sánh 40 và 100, phương thức sort()
gọi hàm so sánh (40, 100).
Hàm tính toán 40 - 100 (a - b)
và vì kết quả là âm (-60) nên hàm sắp xếp sẽ sắp xếp 40 dưới dạng giá trị thấp hơn 100.
Bạn có thể sử dụng đoạn mã này để thử nghiệm việc sắp xếp theo số lượng và theo thứ tự bảng chữ cái:
<button onclick="myFunction1()">Sort Alphabetically</button>
<button
onclick="myFunction2()">Sort Numerically</button>
<p id="demo"></p>
<script>
const points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
function
myFunction1() {
points.sort();
document.getElementById("demo").innerHTML
= points;
}
function myFunction2() {
points.sort(function(a, b){return
a - b});
document.getElementById("demo").innerHTML = points;
}
</script>
Hãy tự mình thử »Sắp xếp một mảng theo thứ tự ngẫu nhiên
Bằng cách sử dụng hàm sắp xếp, như đã giải thích ở trên, bạn có thể sắp xếp một mảng số theo thứ tự ngẫu nhiên
Ví dụ
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(){return 0.5 - Math.random()});
Phương pháp Fisher Yates
Phương thức point.sort() trong ví dụ trên không chính xác. Nó sẽ ủng hộ một số con số hơn những con số khác.
Phương pháp đúng phổ biến nhất được gọi là Fisher Yates shuffle và được giới thiệu trong khoa học dữ liệu ngay từ năm 1938!
Trong JavaScript, phương thức này có thể được dịch sang dạng này:
Ví dụ
const points = [40, 100, 1, 5, 25, 10];
for (let i = points.length -1; i > 0; i--) {
let j = Math.floor(Math.random() * (i+1));
let k = points[i];
points[i] = points[j];
points[j] = k;
}
Tìm giá trị mảng thấp nhất (hoặc cao nhất)
Không có hàm dựng sẵn nào để tìm giá trị tối đa hoặc tối thiểu trong một mảng.
Để tìm giá trị thấp nhất hoặc cao nhất, bạn có 3 lựa chọn:
- Sắp xếp mảng và đọc phần tử đầu tiên hoặc cuối cùng
- Sử dụng Math.min() hoặc Math.max()
- Viết hàm tự làm
Tìm Min hoặc Max với sắp xếp()
Sau khi sắp xếp một mảng, bạn có thể sử dụng chỉ mục để lấy giá trị cao nhất và thấp nhất.
Sắp xếp tăng dần:
Ví dụ
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// now points[0] contains the lowest value
// and points[points.length-1] contains the highest value
Hãy tự mình thử »Sắp xếp giảm dần:
Ví dụ
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// now points[0] contains the highest value
// and points[points.length-1] contains the lowest value
Hãy tự mình thử »Ghi chú
Sắp xếp toàn bộ mảng là một phương pháp rất kém hiệu quả nếu bạn chỉ muốn tìm giá trị cao nhất (hoặc thấp nhất).
Sử dụng Math.min() trên một mảng
Bạn có thể sử dụng Math.min.apply
để tìm số thấp nhất trong một mảng:
Math.min.apply(null, [1, 2, 3])
tương đương với Math.min(1, 2, 3)
.
Sử dụng Math.max() trên một mảng
Bạn có thể sử dụng Math.max.apply
để tìm số cao nhất trong một mảng:
Math.max.apply(null, [1, 2, 3])
tương đương với Math.max(1, 2, 3)
.
Phương pháp tối thiểu mảng JavaScript
Không có hàm tích hợp nào để tìm giá trị thấp nhất trong mảng JavaScript.
Mã nhanh nhất để tìm số thấp nhất là sử dụng phương pháp tự làm .
Hàm này lặp qua một mảng so sánh từng giá trị với giá trị thấp nhất được tìm thấy:
Ví dụ (Tìm Min)
function myArrayMin(arr) {
let len = arr.length;
let min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
}
Phương pháp tối đa mảng JavaScript
Không có hàm tích hợp nào để tìm giá trị cao nhất trong mảng JavaScript.
Mã nhanh nhất để tìm số cao nhất là sử dụng phương pháp tự làm .
Hàm này lặp qua một mảng so sánh từng giá trị với giá trị cao nhất được tìm thấy:
Ví dụ (Tìm Max)
function myArrayMax(arr) {
let len = arr.length;
let max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
}
Sắp xếp mảng đối tượng
Mảng JavaScript thường chứa các đối tượng:
Ví dụ
const cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
Ngay cả khi các đối tượng có các thuộc tính thuộc các kiểu dữ liệu khác nhau, phương thức sort()
vẫn có thể được sử dụng để sắp xếp mảng.
Giải pháp là viết hàm so sánh để so sánh các giá trị thuộc tính:
So sánh các thuộc tính chuỗi phức tạp hơn một chút:
Ví dụ
cars.sort(function(a, b){
let x = a.type.toLowerCase();
let y = b.type.toLowerCase();
if (x < y) {return -1;}
if (x > y) {return 1;}
return 0;
});
Hãy tự mình thử »Sắp xếp mảng ổn định()
ES2019 đã sửa đổi phương thức Array sort()
.
Trước năm 2019, thông số kỹ thuật cho phép các thuật toán sắp xếp không ổn định như QuickSort.
Sau ES2019, trình duyệt phải sử dụng thuật toán sắp xếp ổn định:
Khi sắp xếp các phần tử trên một giá trị, các phần tử phải giữ vị trí tương đối của chúng với các phần tử khác có cùng giá trị.
Ví dụ
const myArr = [
{name:"X00",price:100 },
{name:"X01",price:100 },
{name:"X02",price:100 },
{name:"X03",price:100 },
{name:"X04",price:110 },
{name:"X05",price:110 },
{name:"X06",price:110 },
{name:"X07",price:110 }
];
Hãy tự mình thử »Trong ví dụ trên, khi sắp xếp theo giá, kết quả không được phép đưa ra những tên ở vị trí tương đối khác như thế này:
X01 100
X03 100
X00 100
X03 100
X05 110
X04 110
X06 110
X07 110
Tham chiếu mảng hoàn chỉnh
Để có tài liệu tham khảo Mảng đầy đủ, hãy truy cập:
Tham chiếu mảng JavaScript hoàn chỉnh .
Tham chiếu chứa các mô tả và ví dụ về tất cả các thuộc tính và phương thức của Mảng.