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()遍历获得的keyvalue也是一样的

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}`);
})