JavaScript中Set和Map总结

496 阅读4分钟

在 JavaScript 中,SetMap 都是基于哈希表实现的。

Set

  • 特点Set 是一种集合类型,用于存储独特的值,确保集合中的每个值都是唯一的。
  • 哈希表Set 内部使用哈希表来存储元素。每个值在插入时会通过哈希函数生成一个哈希值,然后根据这个哈希值确定存储位置。因此,查找、插入和删除操作的时间复杂度通常为 O(1)。
  • 使用场景Set 适用于需要快速判断元素是否存在于集合中,或者需要存储不重复的值的场景。

Set 常用方法和属性

1. 属性

  • size: 返回 Set 对象中值的数量。

    let mySet = new Set([1, 2, 3]);
    console.log(mySet.size); // 输出: 3
    

2. 方法

  • add(value) : 向 Set 添加一个新值,返回 Set 对象本身。

    let mySet = new Set();
    mySet.add(1);
    mySet.add(2);
    console.log(mySet); // 输出: Set { 1, 2 }
    
  • delete(value) : 从 Set 中移除指定的值,返回一个布尔值,表示删除是否成功。

    let mySet = new Set([1, 2, 3]);
    mySet.delete(2);
    console.log(mySet); // 输出: Set { 1, 3 }
    
  • has(value) : 返回一个布尔值,表示 Set 中是否存在指定的值。

    let mySet = new Set([1, 2, 3]);
    console.log(mySet.has(2)); // 输出: true
    console.log(mySet.has(4)); // 输出: false
    
  • clear() : 清空 Set 对象,移除所有值。

    let mySet = new Set([1, 2, 3]);
    mySet.clear();
    console.log(mySet.size); // 输出: 0
    
  • forEach(callback, thisArg) : 使用提供的回调函数遍历 Set 中的每个值。

    let mySet = new Set([1, 2, 3]);
    mySet.forEach(value => console.log(value));
    // 输出:
    // 1
    // 2
    // 3
    
  • values() : 返回一个新的 Iterator 对象,包含 Set 对象中的所有值。

    let mySet = new Set([1, 2, 3]);
    for (let value of mySet.values()) {
      console.log(value); // 输出 1, 2, 3
    }
    
  • keys() : 也是返回 Set 对象中的所有值,与 values() 方法相同。因为 Set 中没有键,所有的键和值是相同的。

    let mySet = new Set([1, 2, 3]);
    for (let key of mySet.keys()) {
      console.log(key); // 输出 1, 2, 3
    }
    
  • entries() : 返回一个新的 Iterator 对象,包含 Set 对象中每个值的 [value, value] 对形式的数组。

    let mySet = new Set([1, 2, 3]);
    for (let entry of mySet.entries()) {
      console.log(entry); // 输出 [1, 1], [2, 2], [3, 3]
    }
    

Map

  • 特点Map 是一种键值对集合,允许使用任何类型的值(包括对象)作为键,并关联一个值。
  • 哈希表Map 也使用哈希表来存储键值对。每个键通过哈希函数生成一个哈希值,从而快速定位存储的值。查找、插入和删除操作的时间复杂度通常也是 O(1)。
  • 使用场景Map 适用于需要通过键快速查找对应值的场景,尤其是当键值对的键不是简单的字符串或数字时。

Map 常用方法和属性

1. 属性

  • size: 返回 Map 对象中键值对的数量。

    let myMap = new Map([['a', 1], ['b', 2]]);
    console.log(myMap.size); // 输出: 2
    

2. 方法

  • set(key, value) : 设置键 key 的值为 value,返回 Map 对象本身。

    let myMap = new Map();
    myMap.set('a', 1);
    myMap.set('b', 2);
    console.log(myMap); // 输出: Map { 'a' => 1, 'b' => 2 }
    
  • get(key) : 返回 key 对应的值,如果 key 不存在则返回 undefined

    let myMap = new Map([['a', 1], ['b', 2]]);
    console.log(myMap.get('a')); // 输出: 1
    console.log(myMap.get('c')); // 输出: undefined
    
  • delete(key) : 删除 Map 对象中指定 key 的键值对,返回一个布尔值,表示删除是否成功。

    let myMap = new Map([['a', 1], ['b', 2]]);
    myMap.delete('a');
    console.log(myMap); // 输出: Map { 'b' => 2 }
    
  • has(key) : 返回一个布尔值,表示 Map 对象是否包含指定的键 key

    let myMap = new Map([['a', 1], ['b', 2]]);
    console.log(myMap.has('a')); // 输出: true
    console.log(myMap.has('c')); // 输出: false
    
  • clear() : 清空 Map 对象,移除所有键值对。

    let myMap = new Map([['a', 1], ['b', 2]]);
    myMap.clear();
    console.log(myMap.size); // 输出: 0
    
  • forEach(callback, thisArg) : 使用提供的回调函数遍历 Map 对象中的每个键值对。

    let myMap = new Map([['a', 1], ['b', 2]]);
    myMap.forEach((value, key) => {
      console.log(key, value);
    });
    // 输出:
    // 'a' 1
    // 'b' 2
    
  • keys() : 返回一个新的 Iterator 对象,包含 Map 对象中的所有键。

    let myMap = new Map([['a', 1], ['b', 2]]);
    for (let key of myMap.keys()) {
      console.log(key); // 输出 'a', 'b'
    }
    
  • values() : 返回一个新的 Iterator 对象,包含 Map 对象中的所有值。

    let myMap = new Map([['a', 1], ['b', 2]]);
    for (let value of myMap.values()) {
      console.log(value); // 输出 1, 2
    }
    
  • entries() : 返回一个新的 Iterator 对象,包含 Map 对象中所有 [key, value] 对形式的数组。

    let myMap = new Map([['a', 1], ['b', 2]]);
    for (let entry of myMap.entries()) {
      console.log(entry); // 输出 ['a', 1], ['b', 2]
    }
    

总结

虽然 SetMap 都基于哈希表,但它们的用途和接口有所不同。Set 专注于元素的唯一性,而 Map 则用于管理键值对。由于哈希表的高效性,这两者都能够在大多数情况下提供快速的查找、插入和删除操作。

在 JavaScript 中,SetMap 都有一些常用的方法和属性。

  • Set 是用来存储唯一值的集合,没有键的概念。
  • Map 是用来存储键值对的集合,支持各种类型的键。

两者都提供了遍历和操作其内容的方法,并且在性能上都具有较高的效率。