js的Set和Map集合
目录
1、js的Set介绍
- Set是ES6提供的一种类似于数组的数据结构。
- 不同于数组的是,它的成员的值都是唯一的,不会有重复。
1-1、Set基础用法
创建一个名为s的Set数据结构的变量
let s = new Set();
在创建Set 对象的时候,还可以传递一个数组(或者具有iterable接口其他数据类型)作为参数,因为Set数据接口不会有重复的值,所以会自动去掉数组中重复的值。
Set去重示例
const log=console.log;
let set = new Set([1,2,2,3,3,4,4]);
let array=[...set];
log(array);

在创建Set 对象的时候, 传递给构造函数的初始值是不会发生类型转换的,所以数字3和字符3是不同的,Set内部判断两个值是否相同时使用的算法是“Same-value equality”,它类似精确相等(===),主要区别是NaN等于自身,而精确相同NaN是不等于自身的。
Set参数类型示例
const log=console.log;
let set = new Set([1,2,3,"3",NaN,NaN]);
let array=[...set];
log(array);

1-2、Set对象的操作方法
| 方法/属性 | 功能介绍 |
|---|---|
| size | 获取当前Set对象的长度 |
| add(value) | 向当前Set对象中添加一个值,返回的是Set对象,所以支持链式写法 |
| delete(value) | 删除当前Set对象中的一个值,返回一个布尔值,表示是否删除成功 |
| has(value) | 检测这个value是否是当前Set对象的一个元素,通过返回的布尔值表示 |
| clear() | 清除当前Set对象所有元素,没有返回值 |
Set对象size属性示例
const log=console.log;
let set = new Set([1,2,3,4]);
log(set.size);

Set对象add方法示例
const log=console.log;
let set = new Set();
set.add(1).add(2).add(3);
let array=[...set];
log(array);

Set对象delete方法示例
const log=console.log;
let set = new Set([1,2,3,4,5]);
set.delete(5);
let array=[...set];
log(array);

Set对象has方法示例
const log=console.log;
let set = new Set([1,2,3,4,5]);
let isSetValue=set.has(5);
log(isSetValue);

Set对象clear方法示例
const log=console.log;
let set = new Set([1,2,3,4,5]);
set.clear();
let array=[...set];
log(array);

1-3、Set对象的遍历方法
| 方法/属性 | 功能介绍 |
|---|---|
| keys() | 返回该Set对象键名的遍历器 |
| values() | 返回该Set对象键值的遍历器 |
| entries() | 返回该Set对象键值对的遍历器 |
| forEach() | 使用回调函数遍历该Set对象的每个元素 |
由于Set对象键名和键值都是同一个值,所以keys()和values()方法完全一致。
Set对象默认可以遍历,其默认遍历器生产函数就是它的values方法,所以可以省略values方法,直接用for...of遍历。
Set.prototype[Symbol.iterator] === Set.prototype.values
//true
Set对象的keys方法和values方法示例
const log=console.log;
let set = new Set(["你","好","!"]);
for(let i of set.keys()){
log(i);
}
for(let i of set.values()){
log(i);
}
for(let i of set){
log(i);
}

因为entries方法同时包含键和值,所以使用entries方法遍历Set对象的时候返回的是包含键值的数组
Set对象的entries方法示例
const log=console.log;
let set = new Set(["你","好","!"]);
for(let i of set.entries()){
log(i);
}

因为扩展运算符(...)内部使用的for...of循环,所以扩展运算符也可用于Set对象。
Set对象的forEach方法示例
const log = console.log;
let set = new Set(["你", "好", "!"]);
set.forEach((value,key) => {
log(value,key)
})
log([...set]);

2、js的Set扩展WeakSet篇
WeakSet的概述:
- WeakSet数据结构是一种类似于Set的数据结构,因此也不可以重复
- WeakSet的成员只能是对象,不能是其他值,并且对象都是弱引用
- 因为成员都是对象的弱引用,所以随时都可能会被垃圾回收,因此是不能遍历的
- WeakSet相对于Set的属性和方法而言,没有size, 也没有clear
3、js的Map介绍
- Map数据结构是一种类似于对象的键值对数据结构
- 不同于对象的是Map的键可以为任意类型的值,而不仅仅为字符串
3-1、Map基础用法
创建一个名为m的Map数据结构的变量
let m = new Map();
在创建Map对象的时候,任何具有Iterator接口且每个成员都是一个双元数组的数据结构都可以当作Map构造函数的参数。
例如以下:
let log=console.log;
let array=[["姓名", "小王"],["年龄","23"]];
let m = new Map(array);
log(m);

3-2、Map对象的操作方法
| 方法/属性 | 功能介绍 |
|---|---|
| size | 获取当前Map对象的长度 |
| set(key,value) | 向当前Map对象中添加一个值,返回的Map对象,所以支持链式写法 |
| get(key) | 通过key找到value,如果找不到,返回undefined |
| delete(key) | 删除当前Map对象中的一个值,返回一个布尔值,表示是否删除成功 |
| has(key) | 检测这个value是否是当前Map对象的一个元素,通过返回的布尔值表示 |
| clear() | 清除当前Map对象所有元素,没有返回值 |
Map对象的size属性
let log=console.log;
let array=[["姓名", "小王"],["年龄","23"]];
let m = new Map(array);
log(m.size);

Map对象的set和get方法
只有对同一对象的引用,Map结构才会将其视为同一个键,这一点要非常小心。
let log=console.log;
let m = new Map();
m.set("名字","张三")
.set({},"李四");
log(m);
log(m.get("名字"));
log(m.get({}));

3-3、Map对象的遍历方法
| 方法/属性 | 功能介绍 |
|---|---|
| keys() | 返回该Map对象键名的遍历器 |
| values() | 返回该Map对象键值的遍历器 |
| entries() | 返回该Map对象键值对的遍历器 |
| forEach() | 使用回调函数遍历该Map对象的每个元素 |
Map对象的keys和values方法
let log=console.log;
let m = new Map();
m.set("名字","张三")
.set({},"李四")
.set("年龄","23");
for(let key of m.keys()){
log(key);
}
log("-----------")
for(let value of m.values()){
log(value);
}

Map对象的entries方法
Map对象默认可以遍历,其默认遍历器生产函数就是它的entries方法,所以可以省略entries方法,直接用for...of遍历。
map[Symbol.iterator] === map.entriies
//true
let log=console.log;
let m = new Map();
m.set("名字","张三")
.set({},"李四")
.set("年龄","23");
for(let [key,value] of m.entries()){
log(key+"==>"+value);
}
log("-----------");
for(let [key,value] of m.entries()){
log(key+"==>"+value);
}

Map对象的forEach方法
let log=console.log;
let m = new Map();
m.set("名字","张三")
.set({},"李四")
.set("年龄","23");
m.forEach((value,key,map)=>{
log("key: %s ==> value: %s",key,value);
})

4、js的Map扩展WeakMap篇
WeakMap的概述:
- WeakMap数据结构是一种类似于Map的数据结构,不过键名必须为对象(null除外)
- 与Map的键名不同的是,WeakMap的键名都是弱引用。
- 因为键名都是对象的弱引用,所以随时都可能会被垃圾回收,因此是不能遍历的
- WeakMap相对于Map的属性和方法而言,没有size,也没有clear
js的Set和Map集合的更多相关文章
- js前台取用后台传递过来的map集合方式
在处理有些特殊需求的时候,我们需要在前台页面的js中获取后台传递过来的map集合类型的参数,并且进行调用,代码如下: 在后台我们拼装出如下的集合: Map<String,Grade> gr ...
- 后台返回数据为map集合,前端js处理方法
当后台返回的数据不是json而是map集合的时候,前端js中处理就将其看作是一个数组,例如后台返回的代码入下: Map<String, String> result = new HashM ...
- Immutable.js – JavaScript 不可变数据集合
不可变数据是指一旦创建就不能被修改的数据,使得应用开发更简单,允许使用函数式编程技术,比如惰性评估.Immutable JS 提供一个惰性 Sequence,允许高效的队列方法链,类似 map 和 f ...
- java代码中后台向前台传递list或map集合案例
导入jar包 新建一个servert传递map集合 ajax.java代码: package servlet; import java.io.IOException; import java.io.P ...
- ES6中的Set和Map集合
前面的话 在ES6标准制定以前,由于可选的集合类型有限,数组使用的又是数值型索引,因而经常被用于创建队列和栈.如果需要使用非数值型索引,就会用非数组对象创建所需的数据结构,而这就是Set集合与Map集 ...
- 【读书笔记】【深入理解ES6】#7-Set集合和Map集合
ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...
- ES6中的Map集合(与java里类似)
Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构.ES6也添加了Map集合来解决类似的问题 一.Map集合 JS的对象(Object),本质上是键值对的集合(Hash结构),但是 ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- Java常用的几种集合, Map集合,Set集合,List集合
Java中 Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...
随机推荐
- text-overflow属性
text-overflow属性有两个值, 默认值是clip:当对象内文本溢出时不显示裁切掉. 另一个就是:ellipsis:对象内文本溢出时显示省略标记(...). 使用text-overflow:e ...
- 学习python-20191208(2)-Python Flask高级编程开发鱼书_第03章_数据与flask路由
视频06: 定义静态方法的两种方式: 1.在方法上方加上装饰@staticmethod 2.在方法上方加上装饰@classmethod 方法中要加参数cls 如:def search_by_isb ...
- Ubuntu16.04编译libjpeg-turbo库
一.环境依赖 CMake v2.8.12或以后 NASM or YASM (if building x86 or x86-64 SIMD extensions),如果使用NASM, 依赖2.10之后版 ...
- 浅谈URL重定向
转载:https://blog.csdn.net/kiyoometal/article/details/90698761 重定向原理 HTTP 协议的重定向响应的状态码为 3xx .浏览器在接收到重定 ...
- python3多进程爬虫(第一卷)
进程这个东西概念很多人很模糊,而多进程并发爬虫也算是爬虫几大难点,现在我先说下进程的基本使用: 开启一个python文件 函数sayhi就是一个进程而且是主进程 现在呢我想循环输出NAME,n 正常我 ...
- 使用阿里大于平台发送短信验证码java代码实现
待续..网站app后台还未完成,不能添加签名,短信不能正常发送. Tip: https://help.aliyun.com/document_detail/55284.html?spm=5176.sm ...
- Spring中@Resorce和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- POJ 2112 Optimal Milking 最短路 二分构图 网络流
题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛.奶牛和挤奶站.挤奶站和挤奶站之间都存在一定的距离.现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走 ...
- html解析过程
Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验 简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都 ...
- 算法笔记-Day_01(1001 害死人不偿命的(3n+1)猜想
卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 ...