Hướng dẫn array object sort javascript - sắp xếp đối tượng mảng javascript
Trong bài này chúng ta sẽ tìm hiểu hàm sort trong javascript, đây là hàm dùng để sắp xếp các phần tử trong chính mảng đó, đồng thời sẽ kết quả đã sắp xếp đó vào một mảng mới. Show
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.freetuts.net, không được copy dưới mọi hình thức. Thứ tự sắp xếp mặc định được tính là tăng dần. Tuy nhiên, bạn có thể can thiệp vào quá trình sắp xếp bằng cách truyền vào nó một hàm callback. Trước khi đi vào học cú pháp thì hãy xem ví dụ dưới đây. array.sort() const months = ['March', 'Jan', 'Feb', 'Dec']; months.sort(); console.log(months); // output: Array ["Dec", "Feb", "Jan", "March"] const array1 = [1, 30, 4, 21, 100000]; array1.sort(); console.log(array1); // output: Array [1, 100000, 21, 30, 4] 1. Hàm sort trong javascript là gì?Hàm sort là một method thuộc đối tượng array trong javascript, được đùng dể sắp xếp các phần tử trong mảng tăng dần hoặc giảm dần theo số thứ tự trong bảng mã ascii, hoặc theo quy tắc trong callback function.
Cú pháp sort javascript như sau: Bài viết này được đăng tại [free tuts .net] // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... }) Trong đó: const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 là tham số không bắt buộc. Đây là một callback function dùng để quyết định thứ tự sắp xếp của các phần tử trong mảng. Hai tham số const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange5 và const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange6 đại diện cho hai phần tử kề nhau trong mảng, và ta sẽ sử dụng nó để quyết định cách sắp xếp.
2. Các ví dụ hàm array sort trong javascriptVí dụ 1: Trường hợp sắp xếp với chuỗi.: Trường hợp sắp xếp với chuỗi. const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange Ví dụ 2: Trường hợp sắp xếp với số.: Trường hợp sắp xếp với số. var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9] Như bạn thấy, kết quả trả về là sai, bởi hàm sort nó hiểu giữa hai số 3 và 10 thì 3 lớn hơn 1, vì vậy 3 sẽ đứng sau 10. Để khắc phục thì ta sẽ sử dụng callback function như sau: var score = [700, 8, 9, 10, 3]; console.log(score.sort( (firstEl, secondEl) => { if (secondEl > firstEl){ return -1; } else { return 0; } } )); // Kết quả: [3, 8, 9, 10, 700] Ví dụ 3: Sử dụng hàm sort để so sánh một mảng với các phần tử là các chuỗi.: Sử dụng hàm sort để so sánh một mảng với các phần tử là các chuỗi. Ví dụ 4: Sử dụng tham số compareFn.: Sử dụng tham số compareFn. Như vậy là mình đã hướng dẫn xong cách sử dụng hàm sort trong javascript để sắp xếp mảng tăng dần trong javascript. Hẹn gặp lại các bạn ở các bài tiêp theo nhé. Phương thức Độ phức tạp về thời gian và không gian của loại không thể được đảm bảo vì nó phụ thuộc vào việc thực hiện. Thử nóCú pháp
Thông sốconst fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 Tùy chọnOptional Chỉ định một hàm xác định thứ tự sắp xếp. Nếu bị bỏ qua, các phần tử mảng được chuyển đổi thành các chuỗi, sau đó được sắp xếp theo giá trị điểm mã Unicode của mỗi ký tự. var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]3 Yếu tố đầu tiên để so sánh. var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]4 Yếu tố thứ hai để so sánh. Giá trị trả vềCác tham chiếu đến mảng ban đầu, bây giờ được sắp xếp. Lưu ý rằng mảng được sắp xếp tại chỗ và không có bản sao nào được thực hiện. Sự mô tảNếu const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 không được cung cấp, tất cả các phần tử không phải là -____ 36 được sắp xếp bằng cách chuyển đổi chúng thành các chuỗi và so sánh các chuỗi theo thứ tự đơn vị mã UTF-16. Ví dụ: "chuối" đến trước "anh đào". Trong một loại số, 9 đến trước 80, nhưng vì các số được chuyển đổi thành chuỗi, "80" xuất hiện trước "9" theo thứ tự Unicode. Tất cả các phần tử var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]6 được sắp xếp đến cuối mảng. Phương pháp var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]1 bảo tồn các khe trống. Nếu mảng nguồn thưa thớt, các khe trống được di chuyển đến cuối mảng và luôn luôn đến sau tất cả var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]6. Lưu ý: Trong UTF -16, các ký tự Unicode trên var score = [700, 8, 9, 10, 3]; console.log(score.sort( (firstEl, secondEl) => { if (secondEl > firstEl){ return -1; } else { return 0; } } )); // Kết quả: [3, 8, 9, 10, 700]0 are encoded as two surrogate code units, of the range var score = [700, 8, 9, 10, 3]; console.log(score.sort( (firstEl, secondEl) => { if (secondEl > firstEl){ return -1; } else { return 0; } } )); // Kết quả: [3, 8, 9, 10, 700]1 - var score = [700, 8, 9, 10, 3]; console.log(score.sort( (firstEl, secondEl) => { if (secondEl > firstEl){ return -1; } else { return 0; } } )); // Kết quả: [3, 8, 9, 10, 700]2. The value of each code unit is taken separately into account for the comparison. Thus the character formed by the surrogate pair var score = [700, 8, 9, 10, 3]; console.log(score.sort( (firstEl, secondEl) => { if (secondEl > firstEl){ return -1; } else { return 0; } } )); // Kết quả: [3, 8, 9, 10, 700]3 will be sorted before the character var score = [700, 8, 9, 10, 3]; console.log(score.sort( (firstEl, secondEl) => { if (secondEl > firstEl){ return -1; } else { return 0; } } )); // Kết quả: [3, 8, 9, 10, 700]4. Nếu const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 được cung cấp, tất cả các phần tử không phải là -____ 36 được sắp xếp theo giá trị trả về của hàm so sánh (tất cả các phần tử var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]6 được sắp xếp đến cuối mảng, không có lệnh gọi đến const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4).
Vì vậy, hàm so sánh có dạng sau:
Chính thức hơn, bộ so sánh dự kiến sẽ có các thuộc tính sau, để đảm bảo hành vi sắp xếp thích hợp:
Một bộ so sánh phù hợp với các ràng buộc ở trên sẽ luôn có thể trả lại tất cả các 3, 9 và 5 hoặc liên tục trả lại 9. Ví dụ: nếu một bộ so sánh chỉ trả về 3 và 9, hoặc chỉ trả về 9 và 5, thì nó sẽ không thể sắp xếp một cách đáng tin cậy vì chống đối xứng. Một bộ so sánh luôn trả về 9 sẽ khiến mảng không được thay đổi, nhưng dù sao cũng đáng tin cậy. Bộ so sánh từ vựng mặc định thỏa mãn tất cả các ràng buộc ở trên. Để so sánh các số thay vì các chuỗi, hàm so sánh có thể trừ var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]4 từ var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]3. Hàm sau sẽ sắp xếp mảng theo thứ tự tăng dần (nếu nó không chứa 4 và 5):
Phương pháp var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]1 là chung chung. Nó chỉ mong đợi giá trị 7 sẽ có thuộc tính 8 và các thuộc tính được khóa. Mặc dù các chuỗi cũng giống như mảng, phương pháp này không phù hợp để được áp dụng trên chúng, vì các chuỗi là bất biến.Ví dụTạo, hiển thị và sắp xếp một mảngVí dụ sau đây tạo ra bốn mảng và hiển thị mảng gốc, sau đó các mảng được sắp xếp. Các mảng số được sắp xếp mà không có hàm so sánh, sau đó được sắp xếp bằng một. // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })0 Sắp xếp mảng các đối tượngMảng các đối tượng có thể được sắp xếp bằng cách so sánh giá trị của một trong các thuộc tính của chúng. // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })1 Sắp xếp các ký tự không phải là ASCIIĐể sắp xếp các chuỗi với các ký tự không phải ASCII, tức là các chuỗi có các ký tự có dấu (E, é, è, A, ä, v.v.), các chuỗi từ các ngôn ngữ khác ngoài tiếng Anh, sử dụng 9. Hàm này có thể so sánh các ký tự đó để chúng xuất hiện theo đúng thứ tự.// Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })2 Sắp xếp với bản đồ
const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 có thể được gọi nhiều lần cho mỗi phần tử trong mảng. Tùy thuộc vào bản chất của ____ 24, điều này có thể mang lại chi phí cao. Càng nhiều công việc mà const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 thực hiện và càng có nhiều yếu tố để sắp xếp, có thể sử dụng 3 hiệu quả hơn để sắp xếp. Ý tưởng là đi qua mảng một lần để trích xuất các giá trị thực tế được sử dụng để sắp xếp thành một mảng tạm thời, sắp xếp mảng tạm thời và sau đó đi qua mảng tạm thời để đạt được thứ tự đúng.// Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })3 Có một thư viện nguồn mở có sẵn gọi là Mapsort áp dụng phương pháp này. Sắp xếp () trả về tham chiếu đến cùng một mảngPhương thức var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]1 trả về một tham chiếu đến mảng gốc, do đó, việc biến đổi mảng được trả về cũng sẽ biến đổi mảng gốc. // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })4 Trong trường hợp bạn muốn var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]1 không thay đổi mảng gốc, nhưng trả về một mảng được sao chép nông như các phương thức mảng khác (ví dụ: 3), bạn có thể thực hiện một bản sao nông trước khi gọi var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]1, sử dụng cú pháp lan truyền hoặc 8.// Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })5 Sắp xếp sự ổn địnhKể từ phiên bản 10 (hoặc ECMAScript 2019), đặc điểm kỹ thuật chỉ ra rằng 9 ổn định.Ví dụ, giả sử bạn có một danh sách các học sinh cùng với các lớp của họ. Lưu ý rằng danh sách học sinh đã được sắp xếp trước bằng tên theo thứ tự bảng chữ cái: // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })6 Sau khi sắp xếp mảng này theo 0 theo thứ tự tăng dần:// Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })7 Biến 1 sau đó sẽ có giá trị sau:// Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })8 Điều quan trọng cần lưu ý là các sinh viên có cùng lớp (ví dụ: Alex và Devlin), sẽ vẫn theo cùng thứ tự như trước khi gọi loại. Đây là những gì một thuật toán sắp xếp ổn định đảm bảo. Trước phiên bản 10 (hoặc Ecmascript 2019), sự ổn định sắp xếp không được đảm bảo, có nghĩa là bạn có thể kết thúc với các điều sau: // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })9 Sắp xếp với bộ so sánh không được hình thànhNếu một chức năng so sánh không thỏa mãn tất cả các quy tắc tinh khiết, ổn định, phản xạ, chống đối xứng và chuyển tiếp, như được giải thích trong mô tả, hành vi của chương trình không được xác định rõ. Ví dụ, hãy xem xét mã này: const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange0 Hàm const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 ở đây không được hình thành tốt, bởi vì nó không thỏa mãn tính đối xứng: nếu 3, nó sẽ trả về 3; Nhưng bằng cách hoán đổi var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]3 và var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]4, nó trả về 9 thay vì giá trị âm. Do đó, mảng kết quả sẽ khác nhau trên các động cơ. Ví dụ: V8 (được sử dụng bởi Chrome, Node.js, v.v.) và JavaScriptcore (được Safari sử dụng) sẽ không sắp xếp mảng và trả về 8, trong khi Spidermonkey (được sử dụng bởi Firefox) sẽ trả về mảng được sắp xếp tăng dần, vì 9 .Tuy nhiên, nếu hàm const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange4 được thay đổi một chút để nó trả về 5 hoặc 9: const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange1 Sau đó, V8 và JavaScriptCore sắp xếp nó xuống, như // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })03, trong khi Spidermonkey trả lại nó như: 8.Do sự không nhất quán thực hiện này, bạn luôn được khuyên nên làm cho bộ so sánh của bạn được định dạng tốt bằng cách tuân theo năm ràng buộc. Sử dụng sort () trên các mảng thưa thớtCác khe trống được di chuyển đến cuối mảng. const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange2 Gọi Sắp xếp () trên các đối tượng không phải làPhương pháp var score = [700, 8, 9, 10, 3]; console.log(score.sort()); // Keets Kết quả: [10, 3, 700, 8, 9]1 đọc thuộc tính 8 của 7. Sau đó, nó thu thập tất cả các thuộc tính khóa nguyên hiện có trong phạm vi 9 đến // Functionless array.sort() // Arrow function array.sort((firstEl, secondEl) => { ... } ) // Compare function array.sort(compareFn) // Inline compare function array.sort(function compareFn(firstEl, secondEl) { ... })09, sắp xếp chúng và viết lại chúng. Nếu có các thuộc tính bị thiếu trong phạm vi, các thuộc tính theo dõi tương ứng sẽ bị xóa, như thể các thuộc tính không tồn tại được sắp xếp vào cuối. const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); // Apple,Banana,Mango,Orange3 Thông số kỹ thuật
Tính tương thích của trình duyệt webBảng BCD chỉ tải trong trình duyệt Xem thêm |