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则是两个不同的键。另外,undefinednull也是两个不同的键。虽然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的主要内容,如果未能解决你的问题,请参考以下文章

set集合关于set与set进行比较

Set和multiset容器

set -x 与 set +x

set常用方法

python中set()函数的用法

set 排序实例