跳至主要內容

Map 与 Set

wzCoding大约 4 分钟JavaScriptMap 与 Set

Map 与 Set

在面对各种复杂的需求时,我们可能会设计各种复杂的数据结构来解决问题,然而随着需求和功能的不断变化, ObjectArray 的数据结构可能也无法满足我们的需求,因此出现了 MapSet

Map

Map 是一种键值对的集合,它类似于对象,但是却不同于对象,Map 的键的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,在面对某些复杂的需求时,Map 可能比 Object 更合适。

Map 基本用法

Map 对象为我们提供了一些内置的操作方法,它们的基本用法如下:

  • new Map() —— 创建 map。
  • map.set(key, value) —— 根据键存储值。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined。
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false。
  • map.delete(key) —— 删除指定键的值。
  • map.clear() —— 清空 map。
  • map.size —— 返回当前元素个数。
const map = new Map();
map.set('name', '张三');
map.set('age', 18);
map.set('gender', '男');

console.log(map.get('name')); // 输出:张三
console.log(map.has('name')); // 输出:true
console.log(map.has('address')); // 输出:false

map.delete('age');
console.log(map.has('age')); // 输出:false

map.clear();
console.log(map.size); // 输出:0

Map 遍历

Map 对象提供了一些内置的遍历方法,它们的基本用法如下:

  • map.keys() —— 返回所有键名的遍历器。
  • map.values() —— 返回所有值的遍历器。
  • map.entries() —— 返回所有成员(键和值)的遍历器。
const map = new Map();
map.set('name', '张三');
map.set('age', 18);
map.set('gender', '男');

console.log(map.keys()); // 输出:MapIterator {'name', 'age', 'gender'} 
console.log(map.values()); // 输出:MapIterator {'张三', 18, '男'} 
console.log(map.entries()); // 输出:MapIterator {['name', '张三'], ['age', 18], ['gender', '男']} 

Set

Set 是一个特殊的集合,它的结构类似与数组,但是在 Set 集合中的每个元素只允许出现一次,不能重复。

Set 基本用法

Set 对象为我们提供了一些内置的操作方法,它们的基本用法如下:

  • new Set(iterable) —— 创建 set。
  • set.add(value) —— 向 set 中添加一个值。
  • set.delete(value) —— 删除 set 中的指定值。
  • set.has(value) —— 如果 value 存在则返回 true,否则返回 false。
  • set.clear() —— 清空 set。
  • set.size —— 返回当前元素个数。
const set = new Set();
set.add('张三');
set.add('李四');
set.add('王五');
set.add('张三');

console.log(set); // 输出:Set {'张三', '李四', '王五'}
console.log(set.size); // 输出:3

console.log(set.has('张三')); // 输出:true
console.log(set.has('赵六')); // 输出:false

set.delete('李四');
console.log(set.has('李四')); // 输出:false

set.clear();
console.log(set.size); // 输出:0

Set 遍历

Set 对象提供了一些内置的遍历方法,它们的基本用法如下:

  • set.keys() —— 返回所有键名的遍历器。
  • set.values() —— 返回所有值的遍历器。
  • set.entries() —— 返回所有成员(键和值)的遍历器。
const set = new Set();
set.add('张三');
set.add('李四');
set.add('王五');

console.log(set.keys()); // 输出:SetIterator {'张三', '李四', '王五'} 
console.log(set.values()); // 输出:SetIterator {'张三', '李四', '王五'} 
console.log(set.entries()); // 输出:SetIterator {['张三', '张三'], ['李四', '李四'], ['王五', '王五']} 

Set 集合同样可以使用 for...offorEach 进行遍历。

const set = new Set();
set.add('张三');
set.add('李四');
set.add('王五');

for (let value of set.values()) {
  console.log(value);
}
// 输出:
// 张三
// 李四
// 王五

set.forEach((value) => {
  console.log(value);
})
// 输出:
// 张三
// 李四
// 王五

WeakMap

WeakMap 的数据结构与 Map 类似,但是它与 Map 不同,WeakMap 的键只限于对象,不能使用其他类型的值作为键。使用 WeakMap 的好处是,因为 WeakMap 的键是弱引用,所以当键所引用的对象被垃圾回收时,WeakMap 中的键值对也会被自动删除。

WeakMap 基本用法

WeakMap 对象为我们提供了一些内置的操作方法,它们的基本用法如下:

  • new WeakMap() —— 创建 weakmap。
  • weakmap.set(key, value) —— 根据键存储值。
  • weakmap.get(key) —— 根据键来返回值,如果 weakmap 中不存在对应的 key,则返回 undefined。
  • weakmap.has(key) —— 如果 key 存在则返回 true,否则返回 false。
  • weakmap.delete(key) —— 删除指定键的值。
const weakmap = new WeakMap();
const obj = { name: '张三' };
weakmap.set(obj, '张三');

console.log(weakmap.get(obj)); // 输出:张三
console.log(weakmap.has(obj)); // 输出:true
console.log(weakmap.has('张三')); // 输出:false

weakmap.delete(obj);
console.log(weakmap.has(obj)); // 输出:false

WeakMap 不支持遍历以及 keys()values()entries() 方法。

WeakSet

WeakSet 的数据结构与 Set 类似,但是它与 Set 不同,WeakSet 只允许向其集合中添加对象,不能使用其他类型的值。使用 WeakSet 的好处是,因为 WeakSet 中存储的对象是弱引用,所以当没有其他对象再访问到 WeakSet 中的对象时,WeakSet 中的对象会被自动清除(被垃圾回收机制回收)。

WeakSet 基本用法

WeakSet 对象为我们提供了一些内置的方法,它们的基本用法如下:

  • new WeakSet() —— 创建 weakset。
  • weakset.add(value) —— 向 weakset 中添加一个值。
  • weakset.delete(value) —— 删除 weakset 中的指定值。
  • weakset.has(value) —— 如果 value 存在则返回 true,否则返回 false。
const weakset = new WeakSet();
const obj = { name: '张三' };
weakset.add(obj);

console.log(weakset.has(obj)); // 输出:true
console.log(weakset.has('张三')); // 输出:false

weakset.delete(obj);
console.log(weakset.has(obj)); // 输出:false

WeakSet 不支持遍历以及 keys()values()entries() 方法。

ℹ️提示

更多 Map 与 Set 的详细信息,可以参考以下链接: