ES6中的Set( )

1. set

  1. const s = new Set();  
  2.   
  3. [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));  
  4.   
  5. for (let i of s) {  
  6.   console.log(i);  
  7. }  
2.--添加值

    

  1. // 例一  
  2. const set = new Set([1, 2, 3, 4, 4]);  
  3. [...set]  
  4. // [1, 2, 3, 4]  
  5.   
  6. // 例二  
  7. const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);  
  8. items.size // 5<strong>  
  9. </strong>  

3.

  • add(value):添加某个值,返回Set结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。
Set 结构的实例有四个遍历方法,可以用于遍历成员。

keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员

(1)keys()values()entries()

由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。

  1. let set = new Set(['red', 'green', 'blue']);  
  2.   
  3. for (let item of set.keys()) {  
  4.   console.log(item);  
  5. }  
  6. // red  
  7. // green  
  8. // blue  
  9.   
  10. for (let item of set.values()) {  
  11.   console.log(item);  
  12. }  
  13. // red  
  14. // green  
  15. // blue  
  16.   
  17. for (let item of set.entries()) {  
  18.   console.log(item);  
  19. }  
  20. // ["red", "red"]  
  21. // ["green", "green"]  
  22. // ["blue", "blue"]  


Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法。这意味着,可以省略values方法,直接用for...of循环遍历 Set

[html]  view plain  copy
  1. <span style="font-size:10px;">let set = new Set(['red', 'green', 'blue']);  
  2.   
  3. for (let x of set) {  
  4.   console.log(x);  
  5. }  
  6. // red  
  7. // green  
  8. // blue</span>  

(2)forEach()

Set结构的实例的forEach方法,用于对每个成员执行某种操作,没有返回值。

[html]  view plain  copy
  1. let set = new Set([1, 2, 3]);  
  2. set.forEach((value, key) => console.log(value * 2) )  
  3. // 2  
  4. // 4  
  5. // 6  

(3)遍历的应用

扩展运算符(...)内部使用for...of循环,所以也可以用于 Set 结构。

[html]  view plain  copy
  1. let set = new Set(['red', 'green', 'blue']);  
  2. let arr = [...set];  
  3. // ['red', 'green', 'blue']  
扩展运算符和 Set 结构相结合,就可以去除数组的重复成员。

[html]  view plain  copy
  1. let arr = [3, 5, 2, 2, 5, 5];  
  2. let unique = [...new Set(arr)];  
  3. // [3, 5, 2]  
而且,数组的 map filter 方法也可以用于 Set 了。
[html]  view plain  copy
  1. let set = new Set([1, 2, 3]);  
  2. set = new Set([...set].map(x => x * 2));  
  3. // 返回Set结构:{2, 4, 6}  
  4.   
  5. let set = new Set([1, 2, 3, 4, 5]);  
  6. set = new Set([...set].filter(x => (x % 2) == 0));  
  7. // 返回Set结构:{2, 4}  
因此使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。
[html]  view plain  copy
  1. let a = new Set([1, 2, 3]);  
  2. let b = new Set([4, 3, 2]);  
  3.   
  4. // 并集  
  5. let union = new Set([...a, ...b]);  
  6. // Set {1, 2, 3, 4}  
  7.   
  8. // 交集  
  9. let intersect = new Set([...a].filter(x => b.has(x)));  
  10. // set {2, 3}  
  11.   
  12. // 差集  
  13. let difference = new Set([...a].filter(x => !b.has(x)));  
  14. // Set {1}  
如果想在遍历操作中,同步改变原来的 Set 结构,目前没有直接的方法,但有两种变通方法。一种是利用原 Set 结构映射出一个新的结构,然后赋值给原来的 Set 结构;另一种是利用Array.from方法。


猜你喜欢

转载自blog.csdn.net/zpcqdkf/article/details/80539293
今日推荐