数据结构Set与WeakSet

news/2024/7/10 22:54:52 标签: ES6

        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、不能遍历


http://www.niftyadmin.cn/n/1263804.html

相关文章

linux如何授权HADOOP,hadoop用户权限管理

在上一篇博文我描述了在单机linux上安装hadoop,网址:http://my.oschina.net/hetiangui/blog/142897,这里我主要描述下hadoop的用户权限管理。上篇文章说过,hadoop实际上就是就是一个liunx虚拟机,它的文件操作命令同lin…

Cookie的介绍与应用

HTTP是无状态协议,不对之前发送过的请求和响应状态进行管理。加入一个需要登录的web页面,如果不对登录状态进行管理,那么每次跳转到一个新页面,都需要重新登录。为了解决这一问题,引入了cookie技术。 Cookie通过在请求…

android摇一摇自动注销,[讨论][讨论]关于微信自动摇一摇

smali\com\tencent\mm\plugin\shake\ui\bq.smali这个文件应该是触发摇一摇的函数吧看底部::goto_1iget-object v0, p0, Lcom/tencent/mm/plugin/shake/ui/bq;->aPr:Lcom/tencent/mm/plugin/shake/ui/ShakeReportUI;invoke-static {v0}, Lcom/tencent/mm/plugin/s…

Promise对象的用法与实例

Promise是处理异步请求的一种解决方案,有了Promise就可以将异步操作用同步操作的流程表达处理,避免了回调函数的嵌套。Promise有三种状态,进行中、成功和失败。状态的改变只有两种情况,进行中→成功和进行中→失败,一旦…

android生成md5,如何为Android中的文件生成MD5校验和?

将文件内容转换为字符串&使用以下方法:public static String getMD5EncryptedString(String encTarget){MessageDigest mdEnc null;try {mdEnc MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {System.out.println("…

HTTP首部概念解析

一、HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成两种类型: 端到端首部(End-to-end Header),会转发给请求/响应的最终接收目标,必须保存在由缓存生成的响应中,必须被转发。逐跳首部&a…

android json 反序列化,在android中反序列化JSON字符串

我有JSON字符串,如下所示{ "Status":"Clear", "Class": [{ {"name":"personA", "available" : 1}, {"name":"personB", "available" : 0}, {"name":"personC"…

Nodejs中的Buffer

不记得第一次听到Buffer这个词是在什么情况下了,当时让师傅给我解释的时候,他只给了我三个词:缓冲区、二进制、读与写。用一句话形容就是,Buffer是一块可以以二进制写入和读取数据,并提供了一组方法进行操作的缓冲区。…