8. 新增Set

2/18/2022 ES6

# 1. Set

Set是ES6新增的引用数据类型,类似于数组,但是项(对于对象来说是指针喔~)都是唯一的,可用于数组去重

new Set([1,2,3,2])

// 结构如下
Set(3){
  [[Entries]]:{'0': 1, '1': 2, '2': 3},
  size: 3
}

# 1. 属性

size: 返回Set实例的项数

# 2. 方法

add(item): 向Set添加某项,并返回自身(意味可以链式调用)
delete(item): 删除某项,返回boolean表示是否删除成功
has(item): 检查是否含有某项,返回boolean
clear(): 清除所有项
[Symbol.iterator](): Set类型预置了迭代器,可以进行迭代操作`for...of``...`

示例如下:

let s = new Set([1,2]).add(3).add(4) // [1,2,3,4]
s.add(5) // [1,2,3,4,5]
s.delete(5) // true,删除成功:[1,2,3,4]
for(let item of s) alert(item)  // 1,2,3,4
s.has(1) // true
s.clear() // s.size === 0, true

遍历操作

for...of: 遍历集合每一项
keys(): 返回键名数组
values(): 返回键值数组
entries(): 返回键值对数组
forEach(item=>{ ... }): 使用回调函数遍历每一项 

示例如下

const {log} = console

const s = new Set()
[1,2,2,3].forEach(item => s.add(item)) // Set(3){1,2,3} 唯一性

for(let item of s) log(item) // 1,2,3
for(let key of s.keys()) log(key) // 1,2,3 
for(let val of s.values()) log(val) // 1,2,3
for(let entry of s.entries()) log(entry) // [1,1],[2,2],[3,3]
s.forEach(item=>log(item)) // 1,2,3

# 3. Set函数可以接收iterable作为初始化参数

const set = new Set([1,2,2,3])

const set1 = new Set(document.querySelectorAll('div'))
// 等价于
const set1 = new Set()
let divs = document.querySelectorAll('div')
for(let item of divs) set1.add(item)

用set来实现数组去重字符串去重

[...new Set([1,2,2,3])]
[...new Set('abbc')].join('')

# ☆4. Set实现交集、并集、差集

  let arr1 = [1, 1, 2, 3]
  let arr2 = [2, 3, 4]
  
  // 并集
  function union(arr1, arr2) {
    return [...new Set([...arr1, ...arr2])]
  }
  // 交集
  function intersect(arr1, arr2) {
    return [...new Set(arr1)].filter(item => arr2.includes(item))
  }
  // 差集
  function difference(arr1, arr2) {
    return [...new Set(arr1)].filter(item => !arr2.includes(item))
  }
    人生如梦,
    我投入了的却是真情,
    世界先爱了我,
    我不能不爱它。
    红莲华
    x
    loading...