ES6 Set 数据结构用法总结

news/2025/2/8 13:26:57 标签: es6, 数据结构, 前端

1. Set 基本概念

Set 是 ES6 提供的新的数据结构,类似于数组,但成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构

1.1 基本用法

// 创建一个空Set
const set = new Set();

// 创建一个带有初始值的Set
const set1 = new Set([1, 2, 3, 4, 4]); // {1, 2, 3, 4}

// 从字符串创建Set
const set2 = new Set('hello'); // {'h', 'e', 'l', 'o'}

// Set的大小
console.log(set1.size); // 4

1.2 Set的基本方法

const set = new Set();

// 添加元素
set.add(1);
set.add(2).add(3); // 支持链式调用

// 删除元素
set.delete(1);

// 检查元素是否存在
console.log(set.has(2)); // true

// 清空Set
set.clear();

// 获取Set的大小
console.log(set.size); // 0

Set 是 ES6 提供的一种新的数据结构,它类似于数组,但 元素唯一,不能重复。

let mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(2); // 不会添加重复元素
console.log(mySet); // Set {1, 2}

Set 的常用方法

方法说明
add(value)添加元素
delete(value)删除元素
has(value)检查是否存在
clear()清空集合
size获取元素个数
console.log(mySet.has(1)); // true
mySet.delete(1);
console.log(mySet.has(1)); // false
console.log(mySet.size); // 1
mySet.clear();
console.log(mySet.size); // 0

2. Set的遍历

2.1 遍历方法

const set = new Set(['red', 'green', 'blue']);

// keys() - 返回键名的遍历器
for (let item of set.keys()) {
  console.log(item);
}

// values() - 返回键值的遍历器
for (let item of set.values()) {
  console.log(item);
}

// entries() - 返回键值对的遍历器
for (let item of set.entries()) {
  console.log(item);
}

// forEach() - 使用回调函数遍历每个成员
set.forEach((value, key) => console.log(value, key));

2.2 与数组的转换

// Set转数组
const set = new Set([1, 2, 3]);
const array = [...set];
// 或者
const array2 = Array.from(set);

// 数组转Set
const arr = [1, 2, 3];
const set2 = new Set(arr);

Set 结构支持多种遍历方式。

(1) for…of 遍历
let set = new Set(["apple", "banana", "cherry"]);
for (let item of set) {
  console.log(item);
}
(2) forEach 遍历
set.forEach(value => console.log(value));
(3) 使用 keys()values()entries()
let set = new Set([1, 2, 3]);
console.log([...set.keys()]); // [1, 2, 3]
console.log([...set.values()]); // [1, 2, 3]
console.log([...set.entries()]); // [[1,1], [2,2], [3,3]]

📌 keys()values() 作用相同,因为 Set 只有值,没有键。

3. 实际应用场景

3.1 数组去重

// 基本数组去重
const array = [1, 2, 2, 3, 3, 4, 5, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]

// 对象数组去重
const objArray = [
  { id: 1, name: 'John' },
  { id: 2, name: 'Jane' },
  { id: 1, name: 'John' }
];

const uniqueObjArray = [
  ...new Set(objArray.map(JSON.stringify))
].map(JSON.parse);

3.2 交集、并集、差集操作

const set1 = new Set([1, 2, 3, 4]);
const set2 = new Set([3, 4, 5, 6]);

// 并集
const union = new Set([...set1, ...set2]);
console.log([...union]); // [1, 2, 3, 4, 5, 6]

// 交集
const intersection = new Set(
  [...set1].filter(x => set2.has(x))
);
console.log([...intersection]); // [3, 4]

// 差集
const difference = new Set(
  [...set1].filter(x => !set2.has(x))
);
console.log([...difference]); // [1, 2]

3.3 用户访问记录

class UserVisitTracker {
  constructor() {
    this.visitedPages = new Set();
  }

  recordVisit(page) {
    this.visitedPages.add(page);
  }

  hasVisited(page) {
    return this.visitedPages.has(page);
  }

  getVisitedPages() {
    return [...this.visitedPages];
  }

  getTotalUniqueVisits() {
    return this.visitedPages.size;
  }
}

const tracker = new UserVisitTracker();
tracker.recordVisit('/home');
tracker.recordVisit('/about');
tracker.recordVisit('/home'); // 重复访问不会重复记录

console.log(tracker.getVisitedPages()); // ['/home', '/about']
console.log(tracker.getTotalUniqueVisits()); // 2

3.4 标签管理系统

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

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

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

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

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

const tagManager = new TagManager();
tagManager.addTag('JavaScript');
tagManager.addTag('ES6');
tagManager.addTag('javascript'); // 不会重复添加

console.log(tagManager.getAllTags()); // ['javascript', 'es6']

4. WeakSet

WeakSet 是一种特殊的 Set,它只能存储对象引用,并且是弱引用。

4.1 基本用法

const ws = new WeakSet();
const obj1 = {};
const obj2 = {};

ws.add(obj1);
ws.add(obj2);

console.log(ws.has(obj1)); // true

ws.delete(obj1);
console.log(ws.has(obj1)); // false

4.2 实际应用场景

// 使用 WeakSet 跟踪 DOM 元素
const trackedElements = new WeakSet();

function track(element) {
  trackedElements.add(element);
}

function isTracked(element) {
  return trackedElements.has(element);
}

// 使用示例
const div = document.createElement('div');
track(div);
console.log(isTracked(div)); // true

5. 性能考虑

5.1 Set vs Array

// Set 的查找性能优于数组
const largeArray = Array.from({ length: 100000 }, (_, i) => i);
const largeSet = new Set(largeArray);

console.time('Array search');
largeArray.includes(99999);
console.timeEnd('Array search');

console.time('Set search');
largeSet.has(99999);
console.timeEnd('Set search');

5.2 内存优化

// 使用完后清空 Set
function processData(data) {
  const uniqueData = new Set(data);
  // 处理数据...
  uniqueData.clear(); // 及时清空释放内存
}

6. 最佳实践

  1. 使用 Set 处理唯一值集合
  2. 需要频繁查找操作时使用 Set 代替 Array
  3. 存储对象引用时考虑使用 WeakSet
  4. 合理使用 Set 的方法和属性
  5. 注意内存管理,及时清空不需要的 Set

http://www.niftyadmin.cn/n/5844892.html

相关文章

Elasticsearch 生产集群部署终极方案

Elasticsearch 集群部署 1.集群部署1.1 新增用户1.2 优化操作系统1.3 JDK1.4 elasticsearch1.5 开机自启动 2.安全认证功能2.1 生成CA证书2.2 生成密钥2.3 上传至其他节点2.4 修改属主、属组2.5 配置文件添加参数2.6 各节点添加密钥库密码2.7 设置用户密码 1.集群部署 1.1 新增…

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…

【理论知识】 2D 卷积、3D 卷积与 3D 池化

摘要 卷积神经网络(Convolutional Neural Networks, CNNs)在计算机视觉、视频处理和医学影像分析等领域取得了显著的成功。卷积操作作为CNN的核心,主要包括二维卷积(2D Convolution)、三维卷积(3D Convolu…

探索.NET Core的神秘侦探:CallerMemberName、FilePath、LineNumber

一、引言 在.NET Core 开发的广袤天地中,调试与日志记录堪称开发者手中的两大法宝,它们对于保障程序的稳定运行、快速定位并解决问题起着举足轻重的作用。想象一下,当你的应用程序在生产环境中突然出现异常,没有调试和日志记录的…

【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型 【DeepSeek论文精读】…

Mac: docker安装以后报错Command not found: docker

文章目录 前言解决办法(新的)解决步骤(原来的)不推荐总结 前言 ​本操作参考 http://blog.csdn.net/enhenglhm/article/details/137955756 原作者,更详细请,查看详细内容请关注原作者。 一般,…

Vue基础:计算属性(描述依赖响应式状态的复杂逻辑)

文章目录 引言computed() 方法期望接收一个 getter 函数可写计算属性:计算属性的 Setter计算属性的缓存机制调试 Computed引言 推荐使用计算属性来描述依赖响应式状态的复杂逻辑 computed 函数:它接受 getter 函数并为 getter 返回的值返回一个不可变的响应式 ref 对象。 c…

Linux ftrace 内核跟踪入门

文章目录 ftrace介绍开启ftraceftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on i…