ES6 新增的数据类型Set和Map是什么?区别是什么?应用是什么?

81 阅读3分钟

集合和字典的概念

  • 集合是由一堆无序的、相关联的,且不重复的内存结构【数学中称为元素】组成的组合
  • 字典 是一些元素的集合。每个元素有一个称作key的域,不同元素的key 各不相同

区别?

  • 共同点:集合、字典都可以存储不重复的值
  • 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储

在JavaScript中,ES6引入了SetMap这两种数据结构

Set

Set是一种叫做集合的数据结构,它类似于数组,但是所有元素都是唯一的,没有重复的值。你可以使用Set来存储任何类型的唯一值,无论是原始值还是对象引用。

Set基本用法:

  1. 增删改查
  2. 遍历
  3. size

1、增删改查

  • add() ---------返回Set结构本身
  • delete()-------返回布尔值,表示是否删除成功
  • has()----------返回布尔值,表示该值是否为Set成员
  • claer() -------清除所有成员,没有返回值
const mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(2); // 2 不会被添加,因为 Set 中的元素是唯一的
console.log(mySet.has(1)); // 输出: true
console.log(mySet.size); // 输出: 2
mySet.dekete(1);
mySet.clear();

2、遍历

Set实例遍历的方法如下:

  • keys()--------返回键名的遍历器
  • values()------返回键值的遍历器
  • entries()-----返回键值对的遍历器。
  • forEach()-----使用回调函数遍历每个成员 Set 的遍历顺序就是插入顺序

keys 方法、values 方法、entries 方法返回的都是遍历器对象

let set = new Set(['red', blue', 'green'])

for(let item of set.keys()){
    console.log(item)
}
// red
// green
// blue

for(let item of set.values()){
    console.log(item)
}
// red
// green
// blue

for(let item of set.entries()){
    console.log(item)
}
// ["'red", "red"]
// ["green", "green']
// ["blue", "blue"]

forEach()用于对每个成员执行某种操作,没有返回值,键值、键名都相等,同样的 forEach 方法有第二个参数,用于绑定处理函数的this

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

// 1 : 1
// 4 : 4
// 9 : 9

Map

Map是一种叫做字典的数据结构,Map对象保存键值对。任何值(对象或者原始值)都可以作为一个键或一个值。这意味着你可以使用任何类型的值作为键,而不仅仅是字符串或数字。

Map的基本用法:

  1. 增删改查
  2. 遍历
  3. size

1、增删改查

  • set()
  • get() ------读取key对应的键值,找不到key则返回undefined
  • has() ------返回布尔值,某key是否在当前Map对象中
  • delete() ---返回布尔值,删除某key是否成功
  • clear()-----无返回值,删除所有成员
const myMap = new Map();

myMap.set('a', 1);
myMap.set('b', 2);
myMap.set(1, 'one'); // 数字也可以作为键

console.log(myMap.get('a')); // 输出: 1 

console.log(myMap.size); // 输出: 3

myMap.has(1); // true

myMap.delete(1); // true

myMap.clear()

2、遍历

同Set

Set和Map的区别

  1. 唯一性 vs. 键值对:  Set只存储唯一的值,不考虑键值对。而Map存储的是键值对,你可以通过键来访问对应的值。
  2. 键的类型:  在Set中,所有的值必须是唯一的,但它们可以是任何类型的(例如数字、字符串或对象)。在Map中,键可以是任何类型(包括对象),而值也可以是任何类型。
  3. 用途:  使用Set当你需要存储不重复的元素集合时非常有用,例如去重。使用Map当你需要存储一个对象到另一个对象的映射时非常有用,例如缓存配置管理等。

Set和Map的应用

使用Set和扩展运算符去重

const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = [...new Set(numbers)];
console.log(uniqueNumbers); // [1, 2, 3, 4, 5]

实现并集、交集、差集

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);

// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// (a相对于b的差集)

let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}

使用Map存储键值对

const person = { name: 'Alice' };
const personInfo = new Map();
personInfo.set(person, { age: 30 });
console.log(personInfo.get(person)); // 输出: { age: 30 }

总结

选择Set还是Map取决于你的具体需求:如果你需要存储唯一值的集合,使用Set;如果你需要存储键值对并且键可以是任何类型(包括对象),那么使用Map。