javascript经典面试题:判断两个 Set 是否相同?
题目:完成 isSameSet 函数,它接受了两个 Set 对象作为参数,请你返回 true/false 来表明这两个 set 的内容是否完全一致,例如:
const a = {}
const b = 1
const c = 'ScriptOJ'
const set1 = new Set([a, b, c])
const set2 = new Set([a, c, b])
isSameSet(set1, set2) // => true
答案:
/* 这道题不能简单地使用 sort,使用 sort 并不靠谱。因为 Set 里面的内容可能有很多种类
* 字符串、对象、数字,不同类型之间是不可对比的,所以排序结果并不会一致
*
* 最好的方式是按照数学上集合相等的定义:
* A = B 当且仅当 A 是 B 的子集并且 B 是 A 的子集。
*
* 这种判断方式还可以用在 对象、map 等其他数据类型的判断当中。
*/
const isSameSet = (s1, s2) => {
/* 获取一个集合所有的值,判断另外一个集合是否全部包含该这些值 */
const isSame = (a, b) => {
const values = [...a]
for (let val of values) {
/* 及时跳出循环,可以降低算法复杂度 */
if (!b.has(val)) return false
}
return true
}
/* a 包含 b,b 包含 a,那么两个集合相同 */
return isSame(s1, s2) && isSame(s2, s1)
}
/* By 陈小俊 */
// const isSameSet = (set1, set2) =>
// [...set1].every((o) => set2.has(o)) &&
// [...set2].every((o) => set1.has(o))
THE END