🙋什么是集合?
集合是数学里面的一个概念,是由一组 无序 且 唯一(即不能重复) 的项的组成的。我们先来回顾一下数学里面集合相关的知识。
比如说,一个由大于或者等于 0 的整数组成的自然数集合:
N = {0, 1, 2, 3, 4, 5, 6, ...}。集合中的对象列表用花括号来包围。还有一个概念叫做空集。空集就是不包含任何元素的集合。比如 24 和 29 之间的素数集合,由于 24 和 29 之间没有素数,所以这个集合就是一个空集。空集使用 来表示。
一般集合支持的方法如下:
add(element):向集合添加一个新元素delete(element):从集合移除一个元素has(element):如果元素存在于集合中,返回 true,否则返回 falseclear():移除集合中所有的元素size():返回集合所包含元素的数量。它与数组的 length 属性类似。values():返回一个包含集合中所有元素的数组。
在 ES6 之前,JS 语言并没有内置集合结构,所以我们可以自己来实现这种数据结构。
代码实现
class MySet { constructor() { this.items = {} } add(item) { if (!this.has(item)) { // 当前集合不包含item this.items[item] = item return true } return false } delete(item) { if (this.has(item)) { // 当前集合包含item delete this.items[item] return true } return false } // 判断item是否在集合中已经存在,存在返回true,否则返回false has(item) { // 回头集合里面的每一个元素是以属性的形式挂上去了 return Object.prototype.hasOwnProperty.call(this.items, item) } clear() { this.items = {} } size() { return Object.keys(this.items).length } values() { return Object.values(this.items) }}从 ES6 开始,内置了集合这种数据结构。
const mySet = new Set()
mySet.add(1)mySet.add(2)mySet.add(3)
console.log(mySet)console.log(mySet.size)console.log(mySet.has(2))
mySet.delete(2)console.log(mySet.has(2))
mySet.clear()console.log(mySet.size)console.log(mySet)集合常见操作
集合是数学中的基础概念,在计算机领域也非常重要。它在计算机科学中的主要应用之一是数据库,而数据库是大多数应用程序的根基。集合被用于查询的设计和处理。当我们创建一条从关系型数据库(Oracle、MySQL)中获取一个数据集合的查询语句时,使用的就是集合运算,并且数据库也会返回一个数据集合。
例如,当我们创建一条 SQL 查询命令的时候,可以指定是从表中获取全部数据还是获取其中的子集;也可以获取两种表共有的数据、只存在于一张表而不存在于另一张表的数据,又或是存在于两张表内的数据;这些 SQL 领域的运算被称之为联接,而 SQL 联接的基础就是集合运算。
接下来我们来看一下常见的集合运算有哪些:
-
并集:给定两个集合,返回一个包含两个集合中所有元素的新集合
const s1 = new Set([1, 2, 3])const s2 = new Set([3, 4, 5])const s3 = new Set([...s1, ...s2])console.log(s3) -
交集:给定两个集合,返回一个包含两个集合共有元素的新集合
const s1 = new Set([1, 2, 3])const s2 = new Set([3, 4, 5])const s3 = new Set([...s1].filter((x) => s2.has(x)))console.log(s3) -
差集:给定两个集合,返回一个存在于第一个集合但是不存在于第二个集合的所有元素的新集合
const s1 = new Set([1, 2, 3])const s2 = new Set([3, 4, 5])const s3 = new Set([...s1].filter((x) => !s2.has(x)))console.log(s3) -
子集:验证一个集合是否是另一个集合的子集
const s1 = new Set([1, 2, 3])const s2 = new Set([1, 2, 3, 4, 5])const isSubset = [...s1].every((x) => s2.has(x))console.log(isSubset)