介绍下ES6中的Set

这里贴一段MDN的描述:

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

Set 本身是一种构造函数,用来生成 Set 数据结构。

看下例子:

const s = new Set();
[1, 2, 3, 4, 3, 2, 1, "1"].forEach(x => s.add(x))

// 通过for of遍历
for (let i of s) {
    console.log(i)  // 1 2 3 4 "1"
}

// 利用元素唯一性实现数组去重
let arr = [1, 2, 3, 2, 1, 1]
[... new Set(arr)]  // [1, 2, 3]

需要注意的是,Set在加入值的时候,不会发生类型转换,所以1和“1”被认为是不同的值,类似于使用===来匹配。不过需要注意NaN:NaN === NaN => false

Set实例有下面这些方法:

  • size:内部元素数量
  • add:添加
  • delete:删除
  • has:是否存在?返回true和false
  • clear:清空集合
let set = new Set()
set.add(1).add(2).add(1)

set.has(1)  // true
set.has(3)  // false
set.delete(1)   
set.has(1)  // false

使用Array.from把Set转成数组,或者使用展开运算符:

const items = new Set([1, 2, 3, 2])
const array = Array.from(items)
console.log(array)  // [1, 2, 3]
// 或
const arr = [...items]
console.log(arr)    // [1, 2, 3]

既然是集合,那么Set就具有可便利性,出了for of,还有实例对象带有的方法:

  • keys:返回一个包含集合中所有键的迭代器
  • values: 返回一个包含集合中所有值得迭代器
  • entries:返回一个包含Set对象中所有元素得键值对迭代器
  • forEach:没有返回值,作用跟数组forEach相似
let set = new Set([1, 2, 3])
console.log(set.keys()) // SetIterator {1, 2, 3}
console.log(set.values())   // SetIterator {1, 2, 3}
console.log(set.entries())  // SetIterator {1, 2, 3}

for (let item of set.keys()) {
  console.log(item);
}   // 1    2    3
for (let item of set.entries()) {
  console.log(item);
}   // [1, 1]   [2, 2]  [3, 3]

set.forEach((value, key) => {
    console.log(key + ' : ' + value)
})  // 1 : 1    2 : 2   3 : 3
console.log([...set])   // [1, 2, 3]

Set跟数组作用类似,不过是无序的,可以使用Set元素的唯一性轻松实现交集、并集、差集:

let set1 = new Set([1, 2, 3])
let set2 = new Set([4, 3, 2])

let intersect = new Set([...set1].filter(value => set2.has(value)))
let union = new Set([...set1, ...set2])
let difference = new Set([...set1].filter(value => !set2.has(value)))

console.log(intersect)  // Set {2, 3}
console.log(union)      // Set {1, 2, 3, 4}
console.log(difference) // Set {1}

你可能感兴趣的:(介绍下ES6中的Set)