Không có cách "chuẩn" hoặc "tích hợp sẵn" để thực hiện việc này. Về mặt khái niệm, bạn chỉ cần so sánh hai đối tượng Bản đồ có cùng khóa và giá trị cho mỗi khóa và không có khóa bổ sung.
Để được như hiệu quả về sự so sánh càng tốt, bạn có thể làm tối ưu hóa sau đây:
- Đầu tiên kiểm tra
.size
tài sản trên cả bản đồ. Nếu hai bản đồ không có cùng số lượng khóa, thì bạn biết ngay, chúng không thể giống nhau.
- Hơn nữa, đảm bảo rằng chúng có cùng số lượng khóa cho phép bạn chỉ cần lặp lại một trong các bản đồ và so sánh các giá trị của nó với nhau.
- Sử dụng cú pháp vòng lặp
for (var [key, val] of map1)
để lặp lại các khóa, do đó bạn không phải tự mình xây dựng hoặc sắp xếp một dãy khóa (nên cả bộ nhớ nhanh hơn và hiệu quả hơn).
- Sau đó, cuối cùng, nếu bạn đảm bảo rằng so sánh trả về ngay khi tìm thấy không phù hợp, thì nó sẽ rút ngắn thời gian thực hiện khi chúng không giống nhau.
Sau đó, vì undefined
là một giá trị pháp lý trong một bản đồ, nhưng đó cũng là điều .get()
lợi nhuận nếu phím không được tìm thấy, chúng ta phải xem ra cho điều đó bằng cách làm thêm một .has()
nếu giá trị chúng ta đang so sánh là undefined
. Bởi vì cả hai khóa và giá trị với một đối tượng Map có thể là đối tượng, nên điều này sẽ có nhiều tricker nếu bạn muốn so sánh tài sản sâu sắc của các đối tượng để xác định sự bình đẳng thay vì chỉ đơn giản là ===
mà Javascript sử dụng theo mặc định để kiểm tra cùng một đối tượng. Hoặc, nếu bạn chỉ quan tâm đến các đối tượng có nguyên thủy cho các khóa và giá trị, thì có thể tránh được sự phức tạp này.
Đối với hàm chỉ kiểm tra bình đẳng giá trị nghiêm ngặt (kiểm tra đối tượng để xem chúng có cùng đối tượng vật lý chứ không phải so sánh thuộc tính sâu), bạn có thể thực hiện những gì được hiển thị bên dưới. Điều này sử dụng cú pháp ES6 để lặp lại hiệu quả các đối tượng bản đồ và các nỗ lực để cải thiện hiệu suất khi chúng không khớp với mạch ngắn và trả lại false
ngay sau khi tìm thấy sự không phù hợp.
Đoạn mã này yêu cầu Firefox 41 hoặc Chrome 49. Đoạn mã này không hoạt động trong Edge 25 hoặc IE 11 (có thể do người dùng thuộc loại cú pháp ES2 for/of
đang sử dụng). Nó có thể được thực hiện để làm việc trong các trình duyệt khác bằng cách sử dụng công nghệ cũ cho vòng lặp for
, nhưng vì điều này đã có tính năng ES6 (đối tượng Bản đồ) và chúng tôi đang cố gắng tối ưu hóa việc triển khai, tôi đã chọn sử dụng ES6 mới nhất cú pháp.
"use strict";
function compareMaps(map1, map2) {
var testVal;
if (map1.size !== map2.size) {
return false;
}
for (var [key, val] of map1) {
testVal = map2.get(key);
// in cases of an undefined value, make sure the key
// actually exists on the object so there are no false positives
if (testVal !== val || (testVal === undefined && !map2.has(key))) {
return false;
}
}
return true;
}
// construct two maps that are initially identical
var o = {"k" : 2}
var m1 = new Map();
m1.set("obj", o);
m1.set("str0", undefined);
m1.set("str1", 1);
m1.set("str2", 2);
m1.set("str3", 3);
var m2 = new Map();
m2.set("str0", undefined);
m2.set("obj", o);
m2.set("str1", 1);
m2.set("str2", 2);
m2.set("str3", 3);
log(compareMaps(m1, m2));
// add an undefined key to m1 and a corresponding other key to m2
// this will pass the .size test and even pass the equality test, but not pass the
// special test for undefined values
m1.set("str-undefined", undefined);
m2.set("str4", 4);
log(compareMaps(m1, m2));
// remove one key from m1 so m2 has an extra key
m1.delete("str-undefined");
log(compareMaps(m1, m2));
// add that same extra key to m1, but give it a different value
m1.set("str4", 5);
log(compareMaps(m1, m2));
<script src="http://files.the-friend-family.com/log.js"></script>
Nếu bạn muốn làm so sánh đối tượng sâu chứ không chỉ so sánh để xem họ có thể chất cùng một đối tượng, nơi các giá trị có thể là đối tượng hoặc mảng, sau đó cuộc sống trở nên một phức tạp hơn nhiều.
Để làm điều đó, bạn cần một đối tượng phương pháp so sánh sâu mà sẽ đưa vào tài khoản tất cả các nội dung sau:
- so sánh đệ quy cho các đối tượng lồng nhau
- Bảo vệ chống lại tham chiếu vòng tròn (có thể gây ra một vòng lặp vô hạn)
- Tìm hiểu cách so sánh một số loại đối tượng dựng sẵn như
Date
.
Vì rất nhiều đã được viết ở đâu đó về cách so sánh đối tượng sâu (bao gồm một số câu trả lời được bình chọn cao ở đây trên StackOverflow), tôi cho rằng đó không phải là phần chính của câu hỏi của bạn.
cung cấp mã không liên kết –
Cung cấp mã cho cái gì? – Luka
Câu hỏi của bạn. bạn phải tự mình tìm một giải pháp trước khi yêu cầu. của nó trong các quy tắc. bạn phải cung cấp mã ví dụ về những gì bạn đã thử cho đến nay –