Set
Posted 维尼-winnie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Set相关的知识,希望对你有一定的参考价值。
ES6中的新的数据结构
Set:它类似于数组,但是成员的值都是唯一的,没有重复的数据。
Set本身是一个构造函数,用来构造Set数据结构。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);}
Set结构的数据可以用add方法往里面添加一个个数值,并且不会添加重复的值。并且Set结构的数据,是可遍历的。
Set构造函数里面可以接受一个数组为参数( iterable 接口的其他数据结构),用来初始化。换句话来说 ,Set构造函数取的是数组中的每个值为要添加的数据。所以不能添加一般的数值。
const set = new Set([1, 2, 3, 4, 4]);
[...set]
数组中的每一个值(数据)都会保存在一个类似于专门保存值的特性中,且元素整体以数组形式一起保存。换句话来书,数组中的每个元素都是一个独立的部分。但是重复的部分不会重复保存。注意:我们一般直接量声明的对象不具有iterable接口,所以不能被用来放在构造函数中初始化。我们的字符串能被用来初始化,因为它和我们的数组一样,具有iterable接口。
Set结构的数据也是可遍历的,它类似一个数组,所以我们可以用扩展运算符(...),但是不能直接用,要和我们的 [ ] 配合。换句话来说,我们的扩展运算符没有”裸露”在外的习惯
Set结构的对象具有size属性,表示数量。
扩展:运用Set结构我们用来做去重会变得非常简单。注意,在Set结构中数据是严格匹配的(= = =)
所以检测一个Set结构的数据自身有没有指定的数据,要调用.has这个方法。Array.form这个方法可以把Set结构的数据变成数组。
Set 结构的实例有四个遍历方法,可以用于遍历成员。
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
由于Set结构的数据只有键名没有键值,所以两者是相同的。换句话来说。Set结构的数据的values()方法和keys()方法返回的东西是一样的
我们看看entries方法返回的是键值对。每一个键值对都保存在一个一个的数组当中。
上面我们说过,Set对象可以被遍历,被遍历的东西默认是values方法。
注意:扩展运算符中使用了for...of...循环
-----------------------------------------------------------------------------WeakSet
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。
首先,WeakSet 的成员只能是对象,而不能是其他类型的值。
作为构造函数,WeakSet 可以接受一个数组或类似数组的对象作为参数。(实际上,任何具有 Iterable 接口的对象,都可以作为 WeakSet 的参数。)该数组的所有成员,都会自动成为 WeakSet 实例对象的成员。所以数组的所有成员必须是对象。
a是一个数组,它有两个成员,也都是数组。将a作为 WeakSet 构造函数的参数,a的成员会自动成为 WeakSet 的成员。
注意,是a数组的成员成为 WeakSet 的成员,而不是a数组本身。这意味着,数组的成员只能是对象。
WeakSet没有size属性,没有办法遍历它的成员。
WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了。
-------------------------------------------------------Map
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
上面代码使用 Map 结构的set方法,将对象o当作m的一个键,然后又使用get方法读取这个键,接着使用delete方法删除了这个键。
上面的例子展示了如何向 Map 添加成员。作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
如果对同一个键多次赋值,后面的值将覆盖前面的值。
const map1 = new Map();
var arr=[‘a‘];
map1.set(arr, 555);
map1.get(arr);
如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,包括0和-0,布尔值true和字符串true则是两个不同的键。另外,undefined和null也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。
set方法返回的是当前的Map对象,因此可以采用链式写法。
for (let [key, value] of map) {
console.log(key, value);}
// "F" "no"// "T" "yes"
上面代码最后的那个例子,表示 Map 结构的默认遍历器接口(Symbol.iterator属性),就是entries方法。
const map = new Map([
[‘F‘, ‘no‘],
[‘T‘, ‘yes‘],]);
for (let key of map.keys()) {
console.log(key);}
// "F"// "T"for (let value of map.values()) {
console.log(value);}
// "no"// "yes"for (let item of map.entries()) {
console.log(item[0], item[1]);}
// "F" "no"// "T" "yes"
// 或者for (let [key, value] of map.entries()) {
console.log(key, value);}
// "F" "no"// "T" "yes"
Map 结构转为数组结构,比较快速的方法是使用扩展运算符(...)。
const map = new Map([
[1, ‘one‘],
[2, ‘two‘],
[3, ‘three‘],]);
[...map.keys()]
// [1, 2, 3][...map.values()]
// [‘one‘, ‘two‘, ‘three‘][...map.entries()]
// [[1,‘one‘], [2, ‘two‘], [3, ‘three‘]][...map]
// [[1,‘one‘], [2, ‘two‘], [3, ‘three‘]]
三大结构总结
1.Set构造函数取的是数组中的每个值为要添加的数据。所以不能添加一般的数值。数组中的每一个值(数据)都会保存在一个类似于专门保存值的特性中,且元素整体以数组形式一起保存。换句话来书,数组中的每个元素都是一个独立的部分。Set构造函数取的是数组中的每个值为要添加的数据。所以不能添加一般的数值。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);}
const set = new Set([1, 2, 3, 4, 4]);
[...set]
Set结构的数据也是可遍历的,它类似一个数组,所以我们可以用扩展运算符(...),但是不能直接用,要和我们的 [ ] 配合。换句话来说,我们的扩展运算符没有”裸露”在外的习惯。
2.
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。
首先,WeakSet 的成员只能是对象,而不能是其他类型的值。
WeakSet 可以接受一个数组或类似数组的对象作为参数。(实际上,任何具有 Iterable 接口的对象,都可以作为 WeakSet 的参数)。该数组的所有成员,都会自动成为 WeakSet 实例对象的成员。所以数组的所有成员必须是对象。
3.
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
以上是关于Set的主要内容,如果未能解决你的问题,请参考以下文章