集合和字典的概念
- 集合是由一堆无序的、相关联的,且
不重复的内存结构【数学中称为元素】组成的组合 - 字典
是一些元素的集合。每个元素有一个称作
key的域,不同元素的key 各不相同
区别?
- 共同点:集合、字典都可以存储不重复的值
- 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储
在JavaScript中,ES6引入了Set和Map这两种数据结构
Set
Set是一种叫做集合的数据结构,它类似于数组,但是所有元素都是唯一的,没有重复的值。你可以使用Set来存储任何类型的唯一值,无论是原始值还是对象引用。
Set基本用法:
- 增删改查
- 遍历
- 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的基本用法:
- 增删改查
- 遍历
- 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的区别
- 唯一性 vs. 键值对:
Set只存储唯一的值,不考虑键值对。而Map存储的是键值对,你可以通过键来访问对应的值。 - 键的类型: 在
Set中,所有的值必须是唯一的,但它们可以是任何类型的(例如数字、字符串或对象)。在Map中,键可以是任何类型(包括对象),而值也可以是任何类型。 - 用途: 使用
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。