Druga odpowiedź będzie działać dobrze; tutaj jest inna alternatywa.
// 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); }
Należy jednak pamiętać, że to jest nie robić głębokie porównania równości. Więc
eqSet(Set([{ a: 1 }], Set([{ a: 1 }])
zwróci wartość false. Jeśli powyższe dwa zestawy mają być uznane za równe, musimy powtórzyć oba zestawy, wykonując głębokie porównania jakości dla każdego elementu. Zastrzegamy istnienie deepEqual
rutyny. Wtedy logika byłaby taka
// 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;
}
Co to robi: dla każdego członka s1 szukaj głęboko równego członka s2. Jeśli zostanie znaleziony, usuń go, aby nie można go było ponownie użyć. Te dwa zbiory są głęboko równe, jeśli wszystkie elementy w s1 znajdują się w s2, a s2 jest wyczerpane. Niesprawdzone.
Może się przydać: http://www.2ality.com/2015/01/es6-set-operations.html .
===
dotyczy równości wartości, a nie równości obiektów.