前言:参考文章ECMAScript 6 入门
本文连接:https://www.jianshu.com/p/0f957a2453b5
Set是Es6提供的一种新的数据结构。
一、Set的特性:
1、它与Array类似,但是它的成员值是唯一的,不重复的。
2、键名(key)和键值(value)相等
3、Set函数可以接受一个数组,或者具有iterable接口的其他数据结构作为参数,来初始化
4、在Set内部NaN是相等的,两个空对象不相等
5、Array.from方法可以将Set结构转为数组
6、Set的遍历顺序就是插入顺序
二、Set的属性
1.Set.prototype.constructor //构造函数,默认就是Set函数
2.Set.prototype.size // 返回Set实例的成员总数
三、Set实例的方法分为两个大类:操作方法 和遍历方法
1.操作方法
a.add(value): 添加某个值,返回Set结构本身,重复数据不添加
b.delete(value): 删除某个值,返回一个布尔值,表示删除是否成功
c.has(value): 返回一个布尔值,表示该值是否为Set的成员
d.clear(): 清除所有成员,没有返回值
2.遍历方法
a.keys(): 返回键名的遍历器
b.values(): 返回键值的遍历器
c.entries(): 返回键值对的遍历器
d.foreach(): 使用函数遍历每个成员
由于Set结构没有键名,只有键值(或者说键名和键值是相等的),所以keys方法和values方法的行为完全一致。
for (let item of set.keys()) {
console.log(item)
}
// red
// green
// blue
for(let item of set.values()) {
console.log(item)
}
// red
// green
// blue
for(let item of set.entries()) {
console.log(item)
}
// ['red': 'red']
// ['green': 'green']
// ['blue': 'blue']
Set结构的实例默认可遍历,它的默认遍历器生成函数就是它的values
Set.prototype[Symbol.iterator] === Set.prototype.values
// true
// 这意味着,可以省略values方法,直接用for...of 遍历循环Set
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
console.log(x)
}
Set结构的实例和数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ':' + value))
扩展运算符(...)内部使用for...of循环,所以也可以用于Set结构
et set = new Set(['red', 'green', 'blue']);
let arr = [...set];
// ['red', 'green', 'blue']
数组的map和filter方法也可以间接的用于Set
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set结构:{2, 4, 6}
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
// 返回Set结构: {2, 4}
四、Set有什么用处?
1、去除数组重复成员
a.利用Array.from方法将Set结构转为数组
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
b.利用扩展运算符(...)和Set结构相结合
let arr = [3, 5, 2, 2, 5, 5];
let unique= [...new Set(arr)];
// 返回Set结构:{2, 4, 6}
2、通过使用Set来实现并集(Union)、交集(Intersect)和 差集(Difference)
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
a.并集
let union = new Set([...a], [...b]);
// Set {1, 2, 3, 4}
b.交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
c.差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
五、其他
如果想在遍历操作中,同步改变原来的Set结构,目前没有直接的方法,但有两种变通方法。一种是利用原来Set结构映射出一个新的结构,然后赋值给原来的Set结构;另外一种是利用Araay.from 方法。
// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6
//方法二
let set = new Set([1, 2, 3])
set = new Set(Array.from(set, val => val * 2))
// set的值是2, 4, 6
网友评论