另一个答案会很好;这是另一种选择。
// 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); }
但是,要知道,这并没有做深相等比较。所以
eqSet(Set([{ a: 1 }], Set([{ a: 1 }])
将返回false。如果以上两个集合被认为是相等的,我们需要遍历两个集合对每个元素进行深层质量比较。我们规定了deepEqual
例程的存在。那么逻辑将是
// 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;
}
它的作用是:对于s1的每个成员,寻找一个与s2完全相等的成员。如果找到,请将其删除,以便不再使用。如果在s2中找到s1中的所有元素,并且 s2用尽,则这两个集合是完全相等的。未经测试。
您可能会发现这很有用:http : //www.2ality.com/2015/01/es6-set-operations.html。
===
是为了价值平等,而不是对象平等。