ES7 基础:Set 和 Map 集合详解

本文将介绍 ES7 中新增的 Set 和 Map 集合,包括其定义和基本使用方法,并且会分别介绍 Set 和 Map 的不同特性和应用场景。最后,本文还会提供一些示例代码和学习建议。

Set 集合

Set 是一种无序、唯一的数据结构,它的定义很简单:

const set = new Set();

上面的代码创建了一个空的 Set 集合,我们也可以通过传入一个可迭代的对象来初始化 Set 集合,例如:

const set = new Set([1, 2, 3]);

上面的代码会创建一个包含了 1、2、3 元素的 Set 集合。

Set 基本操作

Set 集合提供了如下的基本操作方法:

  • add(value):向 Set 集合添加一个值,如果值已存在则不会添加(Set 集合中的值是唯一的)。
  • delete(value):从 Set 集合中删除一个值,如果该值不存在则不会做任何操作。
  • has(value):判断 Set 集合是否包含某个值,返回布尔值 true 或 false。
  • clear():清空 Set 集合。

下面是一些示例代码:

const set = new Set();
set.add(1);
set.add(2);
set.add(3);

console.log(set.has(1));  // true
console.log(set.has(4));  // false

set.delete(2);
console.log(set);  // Set {1, 3}

set.clear();
console.log(set);  // Set {}

Set 遍历方法

Set 集合提供了三种遍历方法:

  • forEach(callbackFn, thisArg?):遍历 Set 集合中的每一个元素,回调函数接收三个参数:当前元素值、当前元素的索引、Set 集合本身。第二个参数是可选参数,用来指定回调函数执行时的上下文 this。
  • entries():返回一个新的迭代器对象,它的元素是 [value, value] 的数组,即每个元素都是一个包含两个值的数组,第一个值和第二个值都是当前 Set 集合中的元素。
  • values():返回一个新的迭代器对象,它的元素是当前 Set 集合中的所有值(value),不包含索引。

下面是一些示例代码:

const set = new Set([1, 2, 3]);

set.forEach((value, index, set) => {
  console.log(value, index, set);
});

for (const [index, value] of set.entries()) {
  console.log(index, value);
}

for (const value of set.values()) {
  console.log(value);
}

Set 应用

Set 在很多场景下都很有用,例如:

  • 判断一个数组中是否有重复元素。
  • 去除一个数组中的重复元素。
  • 统计一个字符串中有多少个不同的字符。

下面是一些示例代码:

// 判断一个数组中是否有重复元素
function hasDuplicatedItems(arr) {
  return arr.length !== new Set(arr).size;
}

// 去除一个数组中的重复元素
function removeDuplicatedItems(arr) {
  return [...new Set(arr)];
}

// 统计一个字符串中有多少个不同的字符
function countDifferentChars(str) {
  return new Set(str).size;
}

Map 集合

Map 是一种可迭代的、键值对的数据结构,它很容易理解:

const map = new Map();

上面的代码创建了一个空的 Map 集合,我们也可以通过传入一个可迭代的对象来初始化 Map 集合,例如:

const map = new Map([
  ['name', 'Alice'],
  ['age', 18],
  ['sex', 'female']
]);

上面的代码会创建一个包含了 name、age 和 sex 三个键的 Map 集合。

Map 基本操作

Map 集合提供了如下的基本操作方法:

  • set(key, value):向 Map 集合添加一个键值对。
  • get(key):获取 Map 集合中某个键对应的值。
  • has(key):判断 Map 集合中是否包含某个键,返回布尔值 true 或 false。
  • delete(key):从 Map 集合中删除某个键及其对应的值,如果该键不存在则不会做任何操作。
  • clear():清空 Map 集合。

下面是一些示例代码:

const map = new Map();

map.set('name', 'Alice');
map.set('age', 18);
map.set('sex', 'female');

console.log(map.get('name')); // Alice
console.log(map.get('height')); // undefined
console.log(map.has('name')); // true

map.delete('age');
console.log(map); // Map { 'name' => 'Alice', 'sex' => 'female' }

map.clear();
console.log(map); // Map {}

Map 遍历方法

Map 集合提供了三种遍历方法:

  • forEach(callbackFn, thisArg?):遍历 Map 集合中的每一对键值对,回调函数接收三个参数:当前元素的值、当前元素的键、Map 集合本身。第二个参数是可选参数,用来指定回调函数执行时的上下文 this。
  • entries():返回一个新的迭代器对象,它的元素是 [key, value] 的数组,即每个元素都是一个包含两个值的数组,第一个值是当前 Map 集合中的键,第二个值是当前 Map 集合中的值。
  • keys():返回一个新的迭代器对象,它的元素是当前 Map 集合中的所有键。
  • values():返回一个新的迭代器对象,它的元素是当前 Map 集合中的所有值。

下面是一些示例代码:

const map = new Map([
  ['name', 'Alice'],
  ['age', 18],
  ['sex', 'female']
]);

map.forEach((value, key, map) => {
  console.log(value, key, map);
});

for (const [key, value] of map.entries()) {
  console.log(key, value);
}

for (const key of map.keys()) {
  console.log(key);
}

for (const value of map.values()) {
  console.log(value);
}

Map 应用

Map 在很多场景中都很有用,尤其是在需要维护某个键对应的值时。例如:

  • 统计一个数组中每个元素出现的次数。
  • 缓存函数的计算结果。

下面是一些示例代码:

// 统计一个数组中每个元素出现的次数
function countOccurrences(arr) {
  const map = new Map();
  for (const item of arr) {
    map.set(item, (map.get(item) || 0) + 1);
  }
  return map;
}

// 缓存函数的计算结果
function memoize(func) {
  const cache = new Map();
  return function (...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = func.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

总结

本文对 ES7 中新增的 Set 和 Map 集合做了详细的介绍,包括其定义、基本操作、遍历方法和应用。希望本文能够帮助读者更好地了解这两种数据结构,并且能够在实际开发中应用它们。最后,建议读者在学习过程中多动手实践,加深对 Set 和 Map 的理解。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e90f4add4f0e0ff776636


纠错反馈