es6语法特性进阶(5)

Set数据结构
JavaScript 在绝大部分历史时期内只有一种集合类型,那就是数组。数组在 JavaScript 中的使用方式和其它语言很相似,但是其它集合类型的缺乏导致数组也经常被当作队列(queues)和栈(stacks)来使用。
​因为数组的索引只能是数字类型,当开发者觉得非数字类型的索引是必要的时候会使用非数组对象。这项用法促进了以非类数组对象为基础的 set 和 map 集合类型的实现。
Set是类似数组的一种结构,可以存储数据,与数组的区别主要是 Set中的元素不能重复,而数组中的元素可以重复。
一句话总结:Set类型是一个包含无重复元素的有序列表

创建Set和并添加元素
Set本身是一个构造函数。

1
2
3
4
5
6
7
8
//创建Set数据结构对象。
var s = new Set();
//调用set对象的add方法,向set中添加元素
s.add("a");
s.add("c");
s.add("b");
//set的size属性可以获取set中元素的个数
console.log(s.size)

Set中不能添加重复元素

1
2
3
4
5
6
var s = new Set();
s.add("a");
s.add("c");
s.add("b");
s.add("a"); //重复,所以添加失败。注意这个地方并不会保存。
console.log(s.size); // 长度是3

看下面的代码:

1
2
3
4
var s = new Set();
s.add(5);
s.add("5");
console.log(s.size); // 长度是2

在上面的代码中,数字5和字符串5都会添加成功。为什么呢?
Set是使用什么机制来判断两个元素是否相等的呢?
是通过我们前面说过的 Object.is(a, b) 来判断两个元素是否相等。

1
2
3
4
5
6
7
8
9
10
var s = new Set();
s.add(+0);
s.add(-0); //重复添加不进去
s.add(NaN);
s.add(NaN); //重复添加不进去
s.add([]);
s.add([]); //两个空数组不相等,所以可以添加进去
s.add({});
s.add({}); // 两个空对象也不重复,所以也可以添加进去
console.log(s.size); // 长度是6

使用数组初始化Set

1
2
3
//使用数组中的元素来初始化Set,当然碰到重复的也不会添加进去。
var s = new Set([2, 3, 2, 2, 4]);
console.log(s.size)

使用Set的 has() 方法可以判断一个值是否在这个set中。

1
2
3
4
5
let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
console.log(set.has(6)); // false

移除Set中的元素
delete(要删除的值) :删除单个值
clear():清空所有的值

1
2
3
4
5
6
7
8
9
10
let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
set.delete(5);
console.log(set.has(5)); // false
console.log(set.size); // 1
set.clear();
console.log(set.has("5")); // false
console.log(set.size); // 0

遍历Set
数组有个方法forEach可以遍历数组。
Set也有forEach可以遍历Set。
使用Set的forEach遍历时的回调函数有三个参数:

1
2
3
function (value, key, ownerSet){
}

参数1:遍历到的元素的值
参数2:对set集合来说,参数2的值和参数1的值是完全一样的。
参数3:这个 set 自己

1
2
3
4
let set = new Set(["a", "c", "b", 9]);
set.forEach(function (v, k, s) {
console.log(v + " " + (v === k) + " " + (s === set)); // 永远是true
})

for…of也可以遍历set

1
2
3
for(var v of set){
console.log(v)
}

将Set转换为数组
将数组转换为Set相当容易,你只需要在创建Set集合时把数组作为参数传递进去即可。
把Set转换为数组使用前面讲到的扩展运算符也很容易

1
2
3
let set = new Set([1, 2, 3, 3, 3, 4, 5]),
arr = [...set]; //使用扩展运算符。那么新的数组中已经没有了重复元素。注意,此处对set并没有什么影响
console.log(arr); // [1,2,3,4,5]

这种情况在需要去数组中重复元素的时候非常好用。

1
2
3
4
5
6
7
function eliminateDuplicates(items) {
return [...new Set(items)];
}
let numbers = [1, 2, 3, 3, 3, 4, 5, 5, 2, 1, 1],
//返回的是新的没有重复元素的数组。
noDuplicates = eliminateDuplicates(numbers);
console.log(noDuplicates); // [1,2,3,4,5]

Set提供了处理一系列值的方式,不过如果想给这些值添加一些附加数据则显得力不从心,所以又提供了一种新的数据结构:Map

访客的ip和所在地址: 访问时间: 当前时间:

殖民 wechat
欢迎您扫一扫上面的微信公众号
打赏不在多少,请鼓励一下!