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