set和map

140 阅读3分钟

1、set

set是一种集合类型,用于存储一组唯一的值。不允许重复的值

创建set

const set = new Set();
set.add(1);
set.add(2);
set.add(2); // 不会添加,因为 2 已经存在
set.add(3);
console.log(set); // 输出: Set { 1, 2, 3 }

Set 的特点

  • 唯一性Set 中的每个元素都是唯一的,重复的元素会被自动忽略。
  • 无序Set 中的元素是无序的,不能通过索引访问元素,必须通过迭代来访问。
  • 可迭代Set 是可迭代的,可以使用 for...of 进行遍历。

常用方法

  • add(value):向 Set 中添加一个元素。
  • has(value):检查 Set 中是否包含某个值。
  • delete(value):删除 Set 中的某个元素。
  • clear():清空 Set 中的所有元素。
  • size():获取set的大小

2、map

Map 是一种键值对的集合,与普通对象不同,Map 的键可以是任何数据类型,而对象的键通常是字符串或符号。

创建 Map

const map = new Map();
map.set('name', 'Alice');
map.set('age', 30);
map.set('city', 'New York');
console.log(map); // 输出: Map { 'name' => 'Alice', 'age' => 30, 'city' => 'New York' }

Map 的特点

  • 键值对存储Map 存储键值对,键可以是任何类型(比如对象、函数、甚至数组)。
  • 有序Map 中的键值对是有序的,按插入顺序存储。
  • 可迭代Map 是可迭代的,支持使用 for...of 进行遍历。

常用方法

  • set(key, value):设置键值对。
  • get(key):获取指定键的值。
  • has(key):检查 Map 是否包含指定的键。
  • delete(key):删除指定的键值对。
  • clear():清空 Map 中的所有键值对。
  • entries():它返回一个新的迭代器对象,包含 Map 中所有元素的 [key, value] 对,按照插入顺序排列。
const myMap = new Map();
myMap.set('name', 'Alice');
myMap.set('age', 25);

// 获取 entries 迭代器
const entries = myMap.entries();

// 使用迭代器
console.log(entries.next().value); // ['name', 'Alice']
console.log(entries.next().value); // ['age', 25]
console.log(entries.next().value); // undefined (迭代结束)

常用应用场景

set-去重

Set 是去重的理想选择,因为它会自动忽略重复的元素。如果你有一个数组,想去除其中的重复元素,可以直接使用 Set

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueSet = new Set(array);
const uniqueArray = [...uniqueSet]; // 将 Set 转回数组
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

set-标签管理

假设你有一个标签系统,每个标签必须是唯一的,你可以用 Set 来管理这些标签。用户添加标签时,Set 会自动确保标签的唯一性。

class TagManager {
  constructor() {
    this.tags = new Set();
  }

  addTag(tag) {
    this.tags.add(tag);
  }

  removeTag(tag) {
    this.tags.delete(tag);
  }

  hasTag(tag) {
    return this.tags.has(tag);
  }

  getAllTags() {
    return [...this.tags];
  }
}

const manager = new TagManager();
manager.addTag('JavaScript');
manager.addTag('Vue');
manager.addTag('JavaScript'); // 重复标签,不会添加

console.log(manager.getAllTags()); // 输出: ['JavaScript', 'Vue']

map-缓存

Map 非常适合用作缓存存储,尤其是在需要根据一些唯一标识符(比如用户 ID 或请求 URL)来快速查找数据时。它支持任意数据类型作为键,并且具有非常高效的查找性能。

class Cache {
  constructor() {
    this.cache = new Map();
  }

  setCache(key, value) {
    this.cache.set(key, value);
  }

  getCache(key) {
    return this.cache.get(key);
  }

  hasCache(key) {
    return this.cache.has(key);
  }

  clearCache() {
    this.cache.clear();
  }
}

const cache = new Cache();
cache.setCache('user:123', { name: 'Alice', age: 30 });
console.log(cache.getCache('user:123')); // 输出: { name: 'Alice', age: 30 }

配置项存储

Map 还可以用于存储和管理应用程序的配置项。由于配置项通常有多个,且可能需要支持多种数据类型作为键(例如,字符串、数字、对象等),Map 是一个非常合适的选择。

class AppConfig {
  constructor() {
    this.config = new Map();
  }

  setConfig(key, value) {
    this.config.set(key, value);
  }

  getConfig(key) {
    return this.config.get(key);
  }

  deleteConfig(key) {
    this.config.delete(key);
  }
}

const config = new AppConfig();
config.setConfig('theme', 'dark');
config.setConfig('language', 'en');

console.log(config.getConfig('theme')); // 输出: dark
console.log(config.getConfig('language')); // 输出: en