Câu trả lời khác sẽ hoạt động tốt; đây là một thay thế khác.
// Create function to check if an element is in a specified set.
function isIn(s) { return elt => s.has(elt); }
// Check if one set contains another (all members of s2 are in s1).
function contains(s1, s2) { return [...s2] . every(isIn(s1)); }
// Set equality: a contains b, and b contains a
function eqSet(a, b) { return contains(a, b) && contains(b, a); }
// Alternative, check size first
function eqSet(a, b) { return a.size === b.size && contains(a, b); }
Tuy nhiên, hãy lưu ý rằng điều này không tạo ra sự so sánh bình đẳng sâu sắc. Vì thế
eqSet(Set([{ a: 1 }], Set([{ a: 1 }])
sẽ trả về false. Nếu hai tập hợp trên được coi là bằng nhau, chúng ta cần lặp lại cả hai tập hợp để thực hiện so sánh chất lượng sâu trên từng phần tử. Chúng tôi quy định sự tồn tại của một deepEqual
thói quen. Sau đó, logic sẽ là
// Find a member in "s" deeply equal to some value
function findDeepEqual(s, v) { return [...s] . find(m => deepEqual(v, m)); }
// See if sets s1 and s1 are deeply equal. DESTROYS s2.
function eqSetDeep(s1, s2) {
return [...s1] . every(a1 => {
var m1 = findDeepEqual(s2, a1);
if (m1) { s2.delete(m1); return true; }
}) && !s2.size;
}
Điều này có tác dụng gì: đối với mỗi thành viên của s1, hãy tìm kiếm một thành viên bình đẳng sâu sắc của s2. Nếu tìm thấy, hãy xóa nó để không thể sử dụng lại. Hai tập hợp là bằng nhau sâu sắc nếu tất cả các phần tử trong s1 được tìm thấy trong s2 và s2 hết. Chưa được kiểm chứng.
Bạn có thể thấy điều này hữu ích: http://www.2ality.com/2015/01/es6-set-operations.html .
===
là bình đẳng giá trị, không bình đẳng đối tượng.