Computer >> Máy Tính >  >> Lập trình >> Javascript

Khắc phục sự cố với phương thức .sort () trong JavaScript, hai mảng sắp xếp thay vì chỉ một mảng

Một thuộc tính của hàm Array.prototype.sort () là nó là một thuật toán sắp xếp tại chỗ, có nghĩa là nó không tạo ra một bản sao mới của mảng được sắp xếp, nó sắp xếp mảng mà không sử dụng thêm không gian, làm cho nó hiệu quả hơn và nhưng đặc điểm này đôi khi dẫn đến một tình huống khó xử.

Hãy hiểu điều này bằng một ví dụ. Giả sử, chúng ta có một mảng tên với một số chuỗi ký tự Chúng ta muốn giữ nguyên thứ tự của mảng này và muốn một mảng khác chứa các thành phần giống với mảng tên nhưng được sắp xếp theo thứ tự bảng chữ cái.

Chúng ta có thể làm điều gì đó như thế này -

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names;
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

Nhưng như chúng ta đã biết trong JavaScript, mảng cũng là các đối tượng và các đối tượng được sao chép theo tham chiếu chứ không phải theo giá trị, vì vậy việc sắp xếp một mảng dẫn đến việc sắp xếp cả hai mảng, điều mà chúng tôi rõ ràng không muốn.

Giải pháp

1. Sử dụng slice () trong khi khởi tạo mảng mới

Ví dụ

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names.slice();
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

Phương thức slice () thực sự trả về một bản sao cạn, được sao chép vào một mảng mới của mảng mà nó được sử dụng, nếu không có đối số nào được cung cấp, nó sẽ sao chép từ đầu đến cuối.

Mặc dù phương pháp này không hiệu quả lắm vì nó bao gồm việc khởi tạo một mảng mới và chỉ hiệu quả với mảng các ký tự Chuỗi / Số, phương pháp thứ hai hiệu quả hơn một chút và cũng hoạt động tốt với cả mảng đối tượng.

2. Sử dụng JSON.stringify () / JSON.parse ()

Ví dụ

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = JSON.parse(JSON.stringify(names));
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

Chuyển đổi mảng thành chuỗi JSON và trở lại thành mảng theo cách buộc trình biên dịch không sao chép bằng tham chiếu.

Đầu ra cho cả hai phương thức sẽ giống nhau trong bảng điều khiển -

Đầu ra

[ 'Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj' ]
[ 'Anshul', 'Dheeraj', 'Mukesh', 'Rakesh', 'Ram' ]