Die andere Antwort wird gut funktionieren; Hier ist eine andere Alternative.
// 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); }
Beachten Sie jedoch, dass dies nicht der Fall ist tiefe Gleichheit Vergleich zu tun. So
eqSet(Set([{ a: 1 }], Set([{ a: 1 }])
wird false zurückgeben. Wenn die beiden oben genannten Sätze als gleich angesehen werden sollen, müssen wir beide Sätze durchlaufen und tiefe Qualitätsvergleiche für jedes Element durchführen. Wir schreiben die Existenz einer deepEqual
Routine vor. Dann wäre die Logik
// 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;
}
Was dies bedeutet: Suchen Sie für jedes Mitglied von s1 nach einem zutiefst gleichberechtigten Mitglied von s2. Wenn gefunden, löschen Sie es, damit es nicht wieder verwendet werden kann. Die beiden Mengen sind zutiefst gleich, wenn alle Elemente in s1 in s2 gefunden werden. und s2 erschöpft ist. Ungetestet.
Dies kann hilfreich sein: http://www.2ality.com/2015/01/es6-set-operations.html .
===
steht für Wertgleichheit, nicht für Objektgleichheit.