# 定义

  • 一种无序且唯一的数据结构;
  • ES6 中有集合,名为 Set;
  • 集合的常用操作:去重、判断某元素是否在集合中、求交集、并集、差集等数学运算;

# JS 实现集合

// 去重
const arr = [1, 1, 3, 3, 5]
const arr2 = [...new Set(arr)]
console.log(arr2)

// 判断元素是否在集合中
const set = new Set(arr)
const has = set.has(1)
console.log(has)

// 求交集
const set2 = new Set([2, 3])
const set3 = new Set([...set].filter(item => set2.has(item)))
console.log(set3)

# 使用场景

# 两个数组的交集

  • 描述:给定两个数组,编写一个函数来计算它们的交集。

https://leetcode-cn.com/problems/intersection-of-two-arrays/

  • 解题思路:求交集且无序唯一;

  • 解题步骤:用集合对 nums1 去重;然后遍历 nums1,筛选出 num2 也包含的值;

  • 代码:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    return [...new Set(nums1)].filter(item => nums2.includes(item))
};

# ES6 的 Set

// 添加元素
mySet.add(1)
mySet.add(5)
mySet.add(5)
mySet.size // 2
mySet.add('132')
let o = {
  a: 1,
  b: 2
}
mySet.add(o)

// 是否存在
const has = mySet.has(5)

// 删除元素
mySet.delete(5)

// 迭代
for (let item of mySet) {
  console.log(item)
}

for (let item of mySet.keys()) {
  console.log(item)
}

for (let [key, value] of mySet.entries()) {
  console.log(key, value) // 两个相同
}

// 与数组互转
let myArr = [...mySet]
myArr = Array.from(mySet)

// 数组转 set
const mySet2 = new Set([1, 2, 4])

// 求交集
const intersection = new Set([...mySet].filter(x => mySet2.has(x)))

// 求差集
const difference = new Set([...mySet].filter(x => !mySet2.has(x)))

// 求并集
const union = (setA, setB) => {
  return new Set([...setA, ...setB])
}
更新: 11/23/2020, 5:27:37 PM