คำตอบอื่น ๆ จะใช้ได้ดี นี่เป็นอีกทางเลือกหนึ่ง
// 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 }])
จะส่งกลับเท็จ หากทั้งสองชุดข้างต้นถือว่าเท่ากันเราจำเป็นต้องทำซ้ำทั้งสองชุดทำการเปรียบเทียบคุณภาพเชิงลึกในแต่ละองค์ประกอบ เรากำหนดการดำรงอยู่ของ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 หากพบให้ลบออกเพื่อไม่สามารถใช้งานได้อีก ทั้งสองชุดมีค่าเท่ากันอย่างมากหากพบองค์ประกอบทั้งหมดใน s1 ใน s2 และ s2 หมด ยังไม่ทดสอบ
คุณอาจพบว่ามีประโยชน์นี้: http://www.2ality.com/2015/01/es6-set-operations.html
===
มีไว้เพื่อความเท่าเทียมกันของคุณค่าไม่ใช่ความเท่าเทียมกันของวัตถุ