Set与Map
前言:小白本人最近在leetcode上做题,发现经常会用到hash表这种数据结构,并且都是用ES6中的新数据结构Map来实现的,
所以连带着Set来一起总结一下
Set
ES6 提供了新的数据结构 Set
。它类似于数组,允许存储任何类型的值,无论是原始值或者是对象引用,但是成员的值都是唯一的,没有重复的值。
特征
- 只能保存值没有键名
- 严格类型检测,如字符串数字不等于数值型数字
- 值是唯一的
- 遍历顺序是添加的顺序,方便保存回调函数
基本使用
创建
要创建一个Set
,需要提供一个Array
作为输入,或者直接创建一个空Set
:
let s1 = new Set(); // 空Set
let s2 = new Set([1, 2, 3]); // 含1, 2, 3
重复元素在Set
中自动被过滤:
let s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
添加元素
使用 add(key)
方法添加元素,不允许添加重复的值
s2.add(4)// Set {1, 2, 3, 4}
S2.add(1)// Set {1, 2, 3, 4}
获取元素总量
size
属性表示Set
中的元素数量
console.log(s2.size); //4
元素检测
has()
方法来检测Set
中是否含该元素
console.log(s2.has(1));//true
删除元素
使用 delete
方法删除单个元素,返回值为boolean
类型
s2.delete("1") //true
使用 clear
删除所有元素
s1.clear();
数组转换
可以使用点语法
或 Array.form
静态方法将Set类型转为数组,这样就可以使用数组原型中的函数和属性了
console.log([...s2]); // {1, 2, 3, 4}-->[1,2,3,4]
console.log(Array.from(s2)); //{1, 2, 3, 4}-->[1,2,3,4]
去除重复
去除字符串重复
[...new Set("dooog")].join("");//dog
去除数组重复
const arr = [1, 2, 3, 5, 2, 3];
console.log(...new Set(arr)); // 1,2,4,5
遍历数据
keys()
values()
entries()
forEach()
forof
因为set
类型只有值所以 keys与values
方法结果一致,entries()
遍历获得的key
和value
也是一样的
const set=new Set([1, 2, 3])
for (let item of set.keys()) {
console.log(item)
}
//1 2 3
for (let item of set.entries()) {
console.log(item)
}
// [1, 1] [2, 2] [3, 3]
set.forEach((item,key) => console.log(item,key));
// 1 1 2 2 3 3
Map
JavaScript的默认对象表示方式{}
,表示一组键值对。但是JavaScript的对象有个问题,就是键必须是字符串,但实际上我们需要key是其他数据类型。为了解决这个问题,最新的ES6规范引入了新的数据类型Map
。
特征
- 具有极快的查找速度
- 函数、对象、基本类型都可以作为键或值
基本使用
创建
初始化Map
需要一个二维数组,或者直接初始化一个空Map
。
let m = new Map([
['son', 'moji'],
['father', 'blend']
]);
添加元素
使用set
方法添加元素,支持链式操作
let obj={name:"zhangsan"}
map.set(obj, "zhangsan").set("uncle", "lisi");
获取数量
size
属性表示Map
中的元素数量
console.log(map.size);
元素检测
has()
方法来检测Map
中是否含该键值对
console.log(map.has(obj1));
读取元素
get(key)
方法获取key对应的值
console.log(map.get(obj));//zhangsan
删除元素
使用 delete(key)
方法删除单个元素
map.delete(obj);
使用clear
方法清除Map所有元素
map.clear()
数组转换
可以使用展开语法
或 Array.form
静态方法将Map
类型转为数组,这样就可以使用数组原型中的函数和属性了
let map = new Map([["son", "moji"], ["father", "blend"]]);
let newArr = [...map].filter(function(item) {
return item[1].includes("moji");
});//["son", "moji"]
遍历数据
keys()
values()
entries()
forEach()
forof
for (const value of map.values()) {
console.log(value);
}
for (const item of map.entries()) {
console.log(value);
}
for (const [key, value] of map) {
console.log(`${key}=>${value}`);
}
map.forEach((value, key) => {
console.log(`${key}=>${value}`);
})