数据结构Set与WeakSet

        Set是ES6提供的新的数据结构,类似于数组,最大的区别就是没有重复的值,用来去重hin方便,先来个栗子。

const a = new Set([1,1,2,3,4,5,6]);
console.log([...a]); //[1,2,3,4,5,6],一步操作,就把原数组中重复的1去掉啦
console.log(a.size); //6

        如上,去重so easy。此外,Set也提供了一些简单方便的方法,我们继续使用上面的变量a。

a.add(6); //添加某个值,返回Set结构本身
console.log(a.size); //6,重复的项不会被增加
a.add(7);
console.log(a.size); //7
a.delete(1); //true,删除某个值,返回布尔值
a.delete(1); //false,已经被删除了,所以删除失败,返回false
a.has(1); //false,返回布尔值,已经被删除了,返回false
a.has(2); //true,实例中存在该值,返回true
a.clear(); //清空,没有返回值
console.log(a.size); //0

    除了以上四种操作方法,Set还有四种遍历方法,但由于Set结构没有键名,只有键值,所以出现了下面的情况:

let b = new Set(['a','b','c']);
for (let i of b.keys()){
  console.log(i);
}
// a,keys()方法的输出
// b
// c
for (let i of b.values()){
  console.log(i);
}
// a,values()方法的输出
// b
// c
for (let i of b){
  console.log(i);
}
// a,省略values方法,直接用for...of遍历
// b
// c
for (let i of b.entries()){
  console.log(i);
}
//['a','a'],没有键名,输出成员相等的数组
//['b','b']
//['c','c']
b.forEach((value,key) => console.log(key + ',' + value));
// a,a,键名与键值是同一值,两个参数值永远相同
// b,b
// c,c

        举一反三,除了方便的用于去重外,Set还可以快捷的实现数组间交集,并集和差集的处理,时间有限,这里就不粘代码了。


2018年10月26日更新

        今天的业务逻辑中用到了求两个数组的差集,遂顺便来把代码补充一下,供大家参考。

let a=new Set([1,2,3]);
let b=new Set([2,3]);
let diff=new Set([...a].filter(x=>!b.has(x)));

        在使用Set完成需要的操作后,若需要继续进行数组操作,要把Set再次转换为数组。

Array.from(diff);    //[1]

2020年3月29日更新

      时间过的好快,转眼一年半的时间又过去了。今天来补充一下WeakSet与Set的区别。WeakSet与Set类似,也是不重复的值的集合,区别有以下几点:

1、WeakSet的成员只能是对象,不能是其他数据类型,否则会报错;

2、WeakSet的成员都是弱引用,只要对象的其他引用被删除,垃圾回收机制就会释放该对象占用的内存,从而避免内存泄漏。

3、由于WeakSet的成员随时可能被垃圾回收机制回收,成员的数量不稳定,所以没有size属性。

4、没有clear()方法

5、不能遍历

你可能感兴趣的:(ES6)