ES6之set

2021-11-15 15:00:02 浏览数 (1)

ES6之set

Set

在 JavaScript 里通常使用 Array 或 Object 来存储数据。但是在频繁操作数据的过程中查找或者统计并需要手动来实现,并不能简单的直接使用。 比如如何保证 Array 是去重的,如何统计 Object 的数据总数等,必须自己去手动实现类似的需求,不是很方便。 在 ES6 中为了解决上述痛点,新增了数据结构 Set 和 Map,它们分别对应传统数据结构的“集合”和“字典”。首先,我们先来学习下 Set 数据结构。

频繁的数据操作set比Array性能会好很多。

生成set
代码语言:javascript复制
let s = new Set()
let s = new Set([1, 2, 3, 4])
复制代码

初始化的参数必须是可遍历的,可以是数组或者自定义遍历的数据结构(Symbol.iterator)。

添加数据
代码语言:javascript复制
s.add('hello')
s.add('goodbye')
s.add('hello').add('goodbye')
复制代码

Set 数据结构不允许数据重复,所以添加重复的数据是无效的

删除数据
代码语言:javascript复制
// 删除指定数据
s.delete('hello') // true
// 删除全部数据
s.clear()
复制代码
统计数据

Set 可以快速进行统计数据,如数据是否存在、数据的总数

代码语言:javascript复制
// 判断是否包含数据项,返回 true 或 false
s.has('hello') // true
// 计算数据项总数
s.size // 2
复制代码
应用场景
  • 数组去重
  • 合并去重
  • 交集
  • 差集
  • Set遍历方式
    1. keys():返回键名的遍历器
    2. values():返回键值的遍历器
    3. entries():返回键值对的遍历器
    4. forEach():使用回调函数遍历每个成员
    5. for...of:可以直接遍历每个成员
代码语言:javascript复制
//  set去重

const arr = [1, 1, 1, 1, , 1, 1]
const delArr = new Set(arr) // 去重

// 合并去重

const arr2 = [1, 2, 3, 4]
const arr3 = [4, 5, 6, 1]

const delArr2 = new Set([...arr2, arr3])

// 交集
// 交集两个都有 取一个判断就OK
const arr4 = [8, 9, 10]
const arr5 = [11, 7, 9]

const set4 = new Set(arr4)
const set5 = new Set(arr5)
const mergeSet = arr4.filter(i => {
    return set5.has(i)
})


// 差集 
// 第一个有第二个没有 第二个有第一个没有
const arr1 = [1, 2, 3, 4]
const arr2 = [4, 5, 6, 7, 1, 1]
let arr3 = new Set(arr1.filter(item => !s2.has(item)))
let arr4 = new Set(arr2.filter(item => !s1.has(item)))
console.log(arr3)
console.log(arr4)
console.log([...arr3, ...arr4])

//  set去重

const arr = [1, 1, 1, 1, , 1, 1]
const delArr = new Set(arr) // 去重

// 合并去重

const arr2 = [1, 2, 3, 4]
const arr3 = [4, 5, 6, 1]

const delArr2 = new Set([...arr2, arr3])

// 交集
// 交集两个都有 取一个判断就OK
const arr4 = [8, 9, 10]
const arr5 = [11, 7, 9]

let s1 = new Set(arr4)
let s2 = new Set(arr5)
let result = new Set(arr4.filter(item => s2.has(item)))
console.log(Array.from(result))


// 差集 
// 第一个有第二个没有 第二个有第一个没有
const arr1 = [1, 2, 3, 4]
const arr2 = [4, 5, 6, 7, 1, 1]
let arr3 = new Set(arr1.filter(item => !s2.has(item)))
let arr4 = new Set(arr2.filter(item => !s1.has(item)))
console.log(arr3)
console.log(arr4)
console.log([...arr3, ...arr4])
复制代码
WeakSet

weakSet

代码语言:javascript复制
weakSet只能够存储对象,不能遍历。
let ws = new WeakSet()
ws.add({

    imooc:"wanghaoyu"

})
console, log(ws) // { imooc:"wanghaoyu" }
// 同样具有add,delete,has, 没有size和clear方法
复制代码

weakSet是弱引用对象,也就是垃圾回收机制并不会考虑weakSet。

当一个对象除了WeakSet被引用到时候就会被垃圾回收。

0 人点赞