【ES6】Set 和 Map

79 阅读3分钟

前言

SetMap是ES6提供的新的数据结构,它们分别用于处理集合和映射关系。本文,作者将带领大家详细了解它们。

Set

Set本身是一个构造函数,用来生成 Set 数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值

用法

Set通常用于去重,通过Set可以轻松实现数组去重,将数组转为Set,然后再转回数组即可消除重复元素。

const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]

向 Set 加入值的时候,不会发生类型转换,所以5"5"是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做 “Same-value-zero equality”它类似于===主要的区别是向 Set 加入值时认为NaN等于自身,而===认为NaN不等于自身。

Set的方法

操作方法

  • Set.size:返回Set实例的成员总数。
  • Set.add(value):添加某个值,返回 Set 结构本身。
  • Set.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.clear():清除所有成员,没有返回值。
s.add(1).add(2).add(2);
// 注意2被加入了两次

s.size // 2

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2) // true
s.has(2) // false

遍历方法

  • Set.keys():返回键名
  • Set.values():返回键值
  • Set.entries():返回键值对
  • Set.forEach():使用回调函数遍历每个成员

Set的遍历顺序就是插入顺序

1.keys()values()entries()

let set = new Set([1, 2, 3]);

for (let item of set.keys()) {
  console.log(item);
}
// 1
// 2
// 3

for (let item of set.values()) {
  console.log(item);
}
// 1
// 2
// 3

for (let item of set.entries()) {
  console.log(item);
}
//[1, 1]
//[2, 2]
//[3, 3]

2.forEach()

Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

let set = new Set([1, 2, 3]);
set.forEach((value, key) => console.log(key + ' : ' + value))
//1:1
//2:2
//3:3

Map

用法

JavaScript 的对象(Object),本质上是键值对的集合,但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

方法

操作方法

  • Map.size:返回Map实例的成员总数。
  • Map.set(key,value):如果key已经有值,则键值会被更新,否则就新生成该键。
  • Map.get(key):读取key对应的键值,如果找不到key,返回undefined
  • Map.has(value):返回一个布尔值,表示该值是否为Map的成员。
  • Map.clear():清除所有成员,没有返回值。
// 创建一个Map 
let myMap = new Map(); 
// 添加键值对 
myMap.set("name", "John"); 
myMap.set("age", 25); 
myMap.set({ key: "value" }, "objectValue"); 
// 获取值 
console.log(myMap.get("name")); // John 
// 判断键是否存在 
console.log(myMap.has("age")); // true

遍历方法

  • Map.keys():返回键名。
  • Map.values():返回键值。
  • Map.entries():返回所有成员。
  • Map.forEach():遍历 Map 的所有成员。

1.keys()values()entries()

const map = new Map([
  ['1', 1],
  ['2',  2],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "1"
// "2"

for (let value of map.values()) {
  console.log(value);
}
// 1
// 2

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "1" 1
// "2" 2

2.forEach() 与数组的forEach方法类似,也可以实现遍历。

map.forEach(function(value, key, map) {
  console.log(key, value);
});

总结

Set

  1. 唯一性: Set中的元素是唯一的,不会包含重复的值。如果试图添加已经存在的值,操作将被忽略。
  2. 只有键没有值:Set中,元素本身就是唯一的键,没有对应的值。

Map

  1. 键值对: Map是一组键值对的集合,其中的键是唯一的。每个键都与一个值相关联。
  2. 支持任意类型的键:Map中,键可以是任意数据类型,包括基本类型、对象、函数等。