ES6文档学习 - Set

Set

set是es6引入的新的数据类型,常用的技术点:

  1. 初始化一个set,let newSet = new Set([1,2,3])
  2. 增 newSet.add(1)
  3. 删 newSet.delete(1)
  4. 判断是否存在 newSet.has(1) // true
  5. Set的长度 newSet.size
  6. 数组和Set的数据转换 new Set([])/ Array.from(newSet) // 数组去重常用
  7. Set的遍历方法 for…of keys,valus,entries和forEach

##Set

  • es6 引入的数据结构
  • 类似数组
  • 成员唯一,没有重复
  • Set本身是一个构造函数

初始化

1
2
3
var set = new Set(); 
或者
var set = new Set([1,2,3,3,34,5]) // 给Set构造函数传入一个数组

添加/删除元素

1
2
3
4
5
var set = new Set();
set.add(1);// 新增1
set.add(2); // 新增2
// add方法返回set数据本身,所以可以连续的add // set.add(1).add(2)
set // [1,2]

删除

set.delete(1); // 删除

判断是否包含元素

set.has(1); // 判断是否含有1

set长度

set.size // set的长度

清空set

set.clear()

set和数组类型的相互转换

var set = new Set([1,2,3,4]) // 数组转换成set
var array = Array.from(set); // set转换成数组
var array = […new Set([1,2,3,4])]

数组去重

var arr = [1,2,3,4,4,4,4,5,5]

function removeSameItem(arr){
return [… new Set(arr)]
}
removeSameItem(arr);

需要注意的点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# NaN只能加入一个到set
let a = NaN;
let b = NaN;
a===b // false
#但是
var set = new Set();
set.add(a);
set.add(b);
set.size // 1

#两个对象总是不相等的
let set = new Set();

set.add({});
set.size // 1

set.add({});
set.size // 2

遍历

Set 结构的实例有四个遍历方法,可以用于遍历成员。
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    let set = new Set(['red', 'green', 'blue']);
//---------------------------------------keys------------------------------
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue

//---------------------------------------values------------------------------
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue

//---------------------------------------entries------------------------------
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

//---------------------------------------直接使用set------------------------------
for (let x of set) {
console.log(x);
}

//---------------------------------------forEach--------------------------------
set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);// set没有key,所以key和value一样
});
扩展运算符
JavaScript
var set = new Set([1,2,3])
var arr = [...set] // [1,2,3]
数组的map和filter方法也可以间接用于 Set (调用数组的方法再转化成set)
JavaScript
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 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。
JavaScript
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
初到贵宝地,有钱的给个钱场,没钱的挤一挤给个钱场