So sánh xem 2 mảng có giống nhau không là điều mà đôi khi chúng ta phải làm trong ứng dụng JavaScript của mình. Trong bài viết này, chúng ta sẽ xem xét các cách để so sánh mảng trong JavaScript. \>> Xem ngay Tài liệu Java Core giúp bạn “Nâng Cấp” kỹ năng lập trình Vòng lặp forThông thường, chúng ta sẽ suy nghĩ đến các bước đơn giản nhất để so sánh mảng trong JavaScript. Đầu tiên là kiểm tra số lượng phần tử trong 2 mảng. Nếu khác nhau thì rõ ràng 2 mảng đó không thể giống nhau. Khi mà số lượng phần tử trong 2 mảng bằng nhau, chúng ta sẽ kiểm tra các phần tử cùng vị trí để xem chúng có trùng nhau hay không. Rất đơn giản, chúng ta có thể sử dụng vòng lặp for để thực hiện việc so sánh mảng trong JavaScript như sau: `const a = [1, 2, 3, 5]; const b = [1, 2, 3, 5]; let isEqual; if(a.length !== b.length) { isEqual = false; } else { for (let i = 0; i < a.length; i++) { }
}
console.log(isEqual);`Code language: JavaScript (javascript)Array.prototype.everyNếu như việc thực hiện vòng lặp for để so sánh mảng trong JavaScript như ví dụ trên quá rườm ra, bạn có thể sử dụng phương thức every của mảng để kiểm tra xem mọi phần tử trong một mảng có nằm trong mảng mà chúng ta đang so sánh hay không. Nếu chúng có cùng độ dài và mỗi phần tử trong một mảng này cũng nằm trong mảng kia, thì chúng ta biết rằng cả hai mảng đều giống nhau. Ví dụ: `const array1 = [1, 2, 3] const array2 = [1, 2, 3] const sameArray = array1.length === array2.length && array1.every((value, index) => value === array2[index]) console.log(sameArray)`Code language: JavaScript (javascript) Chúng ta có 2 mảng array1 và array2 có nội dung giống nhau. Chúng ta kiểm tra xem cả hai có cùng độ dài hay không trước. Sau đó chúng ta gọi every để so sánh value với array2[index]. Lodash isEqualChúng ta cũng có thể sử dụng phương pháp Lodash’s isEqual để so sánh 2 mảng xem chúng có nội dung giống nhau hay không. Ví dụ: `const array1 = [1, 2, 3] const array2 = [1, 2, 3] const sameArray = _.isEqual(array1, array2) console.log(sameArray)`Code language: JavaScript (javascript) Chúng ta chỉ cần đưa các mảng mà chúng ta muốn so sánh làm đối số của hàm isEqual. JSON.stringifyNgoài ra, chúng ta có thể thực hiện các phép so sánh mảng đơn giản với phương thức JSON.stringify. Nó sẽ chuyển đổi mảng thành chuỗi JSON. Sau đó, chúng ta có thể so sánh các mảng được xâu chuỗi trực tiếp. `const array1 = [1, 2, 3] const array2 = [1, 2, 3] const sameArray = JSON.stringify(array1) === JSON.stringify(array2); console.log(sameArray)`Code language: JavaScript (javascript) Kết luậnChúng ta có thể sử dụng một số cách để so sánh xem 2 mảng có giống nhau trong JavaScript hay không. Cách đơn giản nhất là sử dụng JSON.stringify để so sánh các phiên bản được xâu chuỗi của các mảng. Ngoài ra, chúng ta có thể sử dụng phương thức every để kiểm tra từng phần tử của một mảng để xem chúng có giống nhau hay không. Như các bạn đã biết, Java là một ngôn ngữ hướng đối tượng. Kết quả là thao tác với các đối tượng trong Java là thông lệ. Nhưng sớm hay muộn, bạn phải đối mặt với nhiệm vụ so sánh các đối tượng dựa trên một số đặc điểm. Ví dụ : Giả sử chúng ta có một số thông báo được mô tả bởi
7lớp:
Đặt lớp này trong trình biên dịch Tutorialspoint Java . Đừng quên thêm các câu lệnh nhập:
Trong
8phương thức này, hãy tạo một số thông báo:
Hãy nghĩ xem chúng ta sẽ làm gì nếu muốn so sánh chúng? Ví dụ: chúng tôi muốn sắp xếp theo id. Và để tạo một trật tự, chúng ta cần bằng cách nào đó so sánh các đối tượng để hiểu đối tượng nào nên đến trước (tức là đối tượng nhỏ hơn) và đối tượng nào nên theo sau (tức là đối tượng lớn hơn). Hãy bắt đầu với một lớp như java.lang.Object . Chúng ta biết rằng tất cả các lớp đều ngầm kế thừa
9lớp đó. Và điều này có ý nghĩa vì nó phản ánh khái niệm "mọi thứ đều là đối tượng" và cung cấp hành vi chung cho tất cả các lớp. Lớp này quy định rằng mọi lớp đều có hai phương thức: → Phương thức
0 này
1trả về một số (
1các s khác nhau. Mô tả của phương thức nói rất nhiều: "Trong thực tế hợp lý, phương thức hashCode được xác định bởi lớp Object sẽ trả về các số nguyên riêng biệt cho các đối tượng riêng biệt". Nói cách khác, đối với hai
4s khác nhau, sẽ có
1những s khác nhau. Đó là, phương pháp này không phù hợp để so sánh của chúng tôi. →
6. Phương
7thức trả lời câu hỏi "các đối tượng này có bằng nhau không?" và trả về một
8." Theo mặc định, phương thức này có mã sau:
Nghĩa là, nếu phương thức này không bị ghi đè, thì về cơ bản, nó cho biết liệu các tham chiếu đối tượng có khớp hay không. Đây không phải là điều chúng tôi muốn cho thư của mình, bởi vì chúng tôi quan tâm đến id thư chứ không phải tham chiếu đối tượng. Và ngay cả khi chúng ta ghi đè
7phương thức, điều chúng ta có thể hy vọng nhất là tìm hiểu xem chúng có bằng nhau hay không. Và điều này là không đủ để chúng tôi xác định thứ tự. Vậy chúng ta cần gì sau đó? Chúng ta cần một cái gì đó để so sánh. Người so sánh là a
0. Mở API Java và tìm Bộ so sánh . Thật vậy, có một
1giao diện
2 Như bạn có thể thấy, một giao diện như vậy tồn tại. Một lớp triển khai nó nói, "Tôi triển khai một phương thức so sánh các đối tượng." Điều duy nhất bạn thực sự cần nhớ là hợp đồng so sánh, được thể hiện như sau:
Bây giờ hãy viết một bộ so sánh. Chúng tôi sẽ cần phải nhập khẩu
3. Sau câu lệnh nhập, hãy thêm phần sau vào
8phương thức:
5 Tất nhiên, điều này sẽ không hoạt động, vì
0là một giao diện. Vì vậy, chúng tôi thêm dấu ngoặc nhọn
7sau dấu ngoặc đơn. Viết phương thức sau bên trong dấu ngoặc nhọn:
Bạn thậm chí không cần phải nhớ chính tả. Người so sánh là người thực hiện so sánh, tức là so sánh. Để chỉ ra thứ tự tương đối của các đối tượng, chúng tôi trả về một
2. Về cơ bản là vậy. Tốt đẹp và dễ dàng. Như bạn có thể thấy từ ví dụ, ngoài Bộ so sánh, còn có một giao diện khác —
9, giao diện này yêu cầu chúng tôi triển khai
0phương thức. Giao diện này cho biết, "một lớp triển khai tôi giúp so sánh các thể hiện của lớp đó." Ví dụ:
1việc triển khai
2To như sau:
Java 8 đã giới thiệu một số thay đổi thú vị. Nếu bạn nhìn kỹ vào
0giao diện, bạn sẽ thấy
4chú thích phía trên nó. Chú thích này dành cho mục đích thông tin và cho chúng tôi biết rằng giao diện này đang hoạt động. Điều này có nghĩa là giao diện này chỉ có 1 phương thức trừu tượng, là phương thức không có triển khai. Điều này mang lại cho chúng ta điều gì? Bây giờ chúng ta có thể viết mã của bộ so sánh như thế này:
Chúng tôi đặt tên cho các biến trong ngoặc đơn. Java sẽ thấy rằng vì chỉ có một phương thức nên số lượng và loại tham số đầu vào cần thiết là rõ ràng. Sau đó, chúng tôi sử dụng toán tử mũi tên để chuyển chúng đến phần mã này. Hơn nữa, nhờ có Java 8, giờ đây chúng ta có các phương thức mặc định trong các giao diện. Các phương thức này xuất hiện theo mặc định khi chúng ta triển khai một giao diện. Giao
0diện có một số. Ví dụ:
Có một phương pháp khác sẽ làm cho mã của bạn sạch hơn. Hãy xem ví dụ trên, nơi chúng tôi đã xác định bộ so sánh của mình. Nó làm gì? Nó khá nguyên thủy. Nó chỉ đơn giản là lấy một đối tượng và trích xuất một số giá trị "có thể so sánh được". Ví dụ:
1implements
7, vì vậy chúng tôi có thể thực hiện thao tác so sánh trên các giá trị của trường id thông báo. Hàm so sánh đơn giản này có thể được viết như sau:
Nói cách khác, chúng ta có một
0phép so sánh như sau: nó lấy các đối tượng, sử dụng
9phương thức để lấy một
0từ chúng, sau đó sử dụng
1để so sánh. Và không có cấu trúc khủng khiếp hơn. Và cuối cùng, tôi muốn lưu ý một tính năng nữa. Bộ so sánh có thể được xâu chuỗi. Ví dụ:
0 Ứng dụngTuyên bố một bộ so sánh hóa ra khá hợp lý, bạn có nghĩ vậy không? Bây giờ chúng ta cần xem làm thế nào và ở đâu để sử dụng nó. →
2 Tất nhiên, chúng ta có thể sắp xếp các tập hợp theo cách này. Nhưng không phải mọi bộ sưu tập, chỉ danh sách. Không có gì bất thường ở đây, bởi vì danh sách là loại bộ sưu tập nơi bạn truy cập các phần tử theo chỉ mục của chúng. Điều này cho phép hoán đổi phần tử thứ hai với phần tử thứ ba. Đó là lý do tại sao phương pháp sắp xếp sau đây chỉ dành cho danh sách:
1 →
3 Mảng cũng dễ sắp xếp. Một lần nữa, vì lý do tương tự - các phần tử của chúng được truy cập theo chỉ mục. →
4 Bạn sẽ nhớ lại điều đó
5và
6không đảm bảo thứ tự các phần tử được lưu trữ. NHƯNG, chúng tôi có các triển khai đặc biệt đảm bảo thứ tự. Và nếu các phần tử của bộ sưu tập không triển khai
7, thì chúng ta có thể chuyển a
0tới hàm tạo của nó:
2 →
9 Trong API luồng, xuất hiện trong Java 8, bộ so sánh cho phép bạn đơn giản hóa công việc với các phần tử luồng. Ví dụ: giả sử chúng ta cần một dãy số ngẫu nhiên từ 0 đến 999, bao gồm:
3 Chúng ta có thể dừng lại ở đây, nhưng còn nhiều vấn đề thú vị hơn nữa. Ví dụ: giả sử bạn cần chuẩn bị một
6, trong đó khóa là id thư. Ngoài ra, chúng tôi muốn sắp xếp các khóa này, vì vậy chúng tôi sẽ bắt đầu với đoạn mã sau:
4 Chúng tôi thực sự nhận được một
1ở đây. Và như chúng ta biết, nó không đảm bảo bất kỳ thứ tự nào. Do đó, các phần tử của chúng tôi, được sắp xếp theo id, chỉ đơn giản là mất thứ tự. Không tốt. Chúng ta sẽ phải thay đổi bộ sưu tập của mình một chút:
5 Mã đã bắt đầu trông đáng sợ hơn một chút, nhưng bây giờ vấn đề đã được giải quyết chính xác. Đọc thêm về các nhóm khác nhau ở đây:
Bạn có thể tạo bộ sưu tập của riêng bạn. Đọc thêm tại đây: "Tạo trình thu thập tùy chỉnh trong Java 8" . Và bạn sẽ được lợi khi đọc phần thảo luận tại đây: "Danh sách Java 8 để ánh xạ với luồng" . bẫy rơi
0và
0là tốt. Nhưng có một sắc thái bạn nên nhớ. Khi một lớp thực hiện sắp xếp, nó hy vọng rằng lớp của bạn có thể được chuyển đổi thành tệp
0. Nếu đây không phải là trường hợp, thì bạn sẽ gặp lỗi trong thời gian chạy. Hãy xem xét một ví dụ:
6 Có vẻ như không có gì là sai ở đây. Nhưng trên thực tế, trong ví dụ của chúng ta, nó sẽ thất bại với lỗi:
5 Và tất cả chỉ vì nó đã cố gắng sắp xếp các phần tử (
6rốt cuộc nó là một )...nhưng không thể. Đừng quên điều này khi làm việc với
7và
6. |