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.

Hướng dẫn array object sort javascript - sắp xếp đối tượng mảng javascript

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.

  • Mặc định các phần tử sẽ được sắp xếp theo bảng chữ cái với thứ tự tăng dần, điều này khiến phương thức sort sẽ sắp xếp các chuỗi rất chính xác. Tuy nhiên, khi sắp xếp các số sẽ không được chính xác (ví dụ 20 và 100 thì 20 sẽ lớn hơn 100 vì 2 > 1).
  • Bạn có thể khắc phục điều này bằng việc truyền tham số là một mảng so sánh.
  • Hàm sort sẽ làm thay đổi mảng ban đầu.

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,Orange
4 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,Orange
5 và
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
6 đạ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.
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
4 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,Orange
5 và
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
6 đạ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.

  • Nếu hàm callback trả về số lớn hơn 0 thì
    const fruits = ["Banana", "Orange", "Apple", "Mango"];
    fruits.sort(); // Apple,Banana,Mango,Orange
    6 sẽ đứng trước
    const fruits = ["Banana", "Orange", "Apple", "Mango"];
    fruits.sort(); // Apple,Banana,Mango,Orange
    5.
  • Nếu hàm callback trả về số bé hơn hoặc bằng 0 thì thứ tự được giữ nguyên, tức là
    const fruits = ["Banana", "Orange", "Apple", "Mango"];
    fruits.sort(); // Apple,Banana,Mango,Orange
    5 sẽ đứng trước
    const fruits = ["Banana", "Orange", "Apple", "Mango"];
    fruits.sort(); // Apple,Banana,Mango,Orange
    6.

2. Các ví dụ hàm array sort trong javascript

Ví 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

var score = [700, 8, 9, 10, 3];

console.log(score.sort());
// Keets Kết quả: [10, 3, 700, 8, 9]
1 sắp xếp các phần tử của một mảng tại chỗ và trả về tham chiếu đến cùng một mảng, hiện được sắp xếp. Thứ tự sắp xếp mặc định là tăng dần, được xây dựng khi chuyển đổi các yếu tố thành các chuỗi, sau đó so sánh các chuỗi các giá trị đơn vị mã UTF-16 của chúng.
var score = [700, 8, 9, 10, 3];

console.log(score.sort());
// Keets Kết quả: [10, 3, 700, 8, 9]
1
method sorts the elements of an array in place and returns the reference to the same array, now sorted. The default sort order is ascending, built upon converting the elements into strings, then comparing their sequences of UTF-16 code units values.

Độ 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

// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })

Thông số

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
4 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,Orange
4 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 được mã hóa dưới dạng hai đơn vị mã thay thế, của phạm vi
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. Giá trị của mỗi đơn vị mã được đưa riêng biệt để so sánh. Do đó, ký tự được hình thành bởi cặp thay thế
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 sẽ được sắp xếp trước ký tự
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.
In UTF-16, Unicode characters above
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,Orange
4 đượ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,Orange
4).

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]
9 Giá trị trả về
thứ tự sắp xếp
> 0Sắp xếp
var score = [700, 8, 9, 10, 3];

console.log(score.sort());
// Keets Kết quả: [10, 3, 700, 8, 9]
3 sau
var score = [700, 8, 9, 10, 3];

console.log(score.sort());
// Keets Kết quả: [10, 3, 700, 8, 9]
4
< 0 Sắp xếp
var score = [700, 8, 9, 10, 3];

console.log(score.sort());
// Keets Kết quả: [10, 3, 700, 8, 9]
3 trước
var score = [700, 8, 9, 10, 3];

console.log(score.sort());
// Keets Kết quả: [10, 3, 700, 8, 9]
4
=== 0Giữ thứ tự ban đầu của
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

Vì vậy, hàm so sánh có dạng sau:

function compareFn(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

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:

  • Tinh khiết: Bộ so sánh không làm biến đổi các đối tượng được so sánh hoặc bất kỳ trạng thái bên ngoài nào. .
  • Ổn định: Bộ so sánh trả về kết quả tương tự với cùng một cặp đầu vào.
  • Phản xạ:
    
    
    

    6.
  • Anti-symetric:
    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]
    9 và
    
    
    

    8 phải là
    
    
    

    9 hoặc có các dấu hiệu ngược lại.
  • Transitive: Nếu
    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]
    9 và
    
    
    

    1 cả hai đều dương, bằng không hoặc âm, thì
    
    
    

    2 có tính tích cực giống như hai trước đó.

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
// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
4 và
// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
5):

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

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ị
// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
7 sẽ có thuộc tính
// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
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ảng

Ví 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ượng

Mả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

// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
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,Orange
4 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,Orange
4 thực hiện và càng có nhiều yếu tố để sắp xếp, có thể sử dụng
function compareFn(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}
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ảng

Phươ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ụ:
function compareFn(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}
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
function compareFn(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}
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 định

Kể từ phiên bản 10 (hoặc ECMAScript 2019), đặc điểm kỹ thuật chỉ ra rằng

function compareFn(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}
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

function compareNumbers(a, b) {
  return a - b;
}
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

function compareNumbers(a, b) {
  return a - b;
}
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ành

Nế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,Orange
0

Hàm

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
4 ở đâ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
function compareNumbers(a, b) {
  return a - b;
}
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ề
function compareNumbers(a, b) {
  return a - b;
}
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ì
function compareNumbers(a, b) {
  return a - b;
}
9 .

Tuy nhiên, nếu hàm

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
4 đượ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,Orange
1

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ư:
function compareNumbers(a, b) {
  return a - b;
}
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ớt

Các khe trống được di chuyển đến cuối mảng.

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // Apple,Banana,Mango,Orange
2

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
// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
8 của
// Functionless
sort()

// Arrow function
sort((a, b) => { /* … */ } )

// Compare function
sort(compareFn)

// Inline compare function
sort(function compareFn(a, b) { /* … */ })
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,Orange
3

Thông số kỹ thuật

Sự chỉ rõ
Đặc tả ngôn ngữ Ecmascript # sec-array.prototype.sort
# sec-array.prototype.sort

Tính tương thích của trình duyệt web

Bảng BCD chỉ tải trong trình duyệt

Xem thêm