ES6 Set 数据结构用法总结

server/2025/2/9 0:55:55/

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)); // truews.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.ppmy.cn/server/166073.html

相关文章

预防和应对DDoS的方法

DDoS发起者通过大量的网络流量来中断服务器、服务或网络的正常运行,通常由多个受感染的计算机或联网设备(包括物联网设备)发起。 换种通俗的说法,可以将其想象成高速公路上的一次突然的大规模交通堵塞,阻止了正常的通勤…

java中equals和hashCode为什么要一起重写

文章目录 equals()方法常见的重写规则: hashCode()方法为什么通常需要一起重写 equals() 和 hashCode()?一致性要求哈希表的工作原理避免错误的行为例子说明总结 equals()方法 equa…

2025 IT职业发展方向及推荐

一、云计算与DevOps(推荐指数:★★★★★) 推荐理由: 市场需求: 据Gartner报告,2025年全球公有云市场规模将突破8300亿美元,但混合云管理人才缺口达400万(IDC数据)。 企…

golang命令大全12--命令速查表

至此,本系列博文已将golang的各种应用场景的命令都介绍了一遍,通过熟练使用这些命令,开发者可以更高效地开发、测试和维护Go项目,同时也能够更好地理解和学习Go语言的特性和最佳实践。因此,掌握Go命令行工具是成为一名…

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!

1.stm32启动 1.1 msp和pc的初始值,第一步: 2.boot的值就被锁定了 可以根据实际绑定的值变动, 这里补充一点boot1和0的原理: 1.2来点刺激的: 这里我插入一个链接: 【明解STM32】一文搞明白STM32芯片存储…

Android Studio 2024.2.2.13版本安装配置详细教程

Android Studio 是由 Google 官方开发和维护的集成开发环境(IDE),专为 Android 应用开发设计。它是基于 JetBrains 的 IntelliJ IDEA 平台构建的,集成了丰富的工具和功能,帮助开发者高效构建、调试、测试和发布 Androi…

uniapp mqttjs 小程序开发

在UniApp中集成MQTT.js开发微信小程序时,需注意平台差异、协议兼容性及消息处理等问题。以下是关键步骤与注意事项的综合指南: 一、环境配置与依赖安装 安装MQTT.js 推荐使用兼容性较好的版本:mqtt4.1.0(H5和小程序兼容性最佳&…

Nginx与frp结合实现局域网和公网的双重https服务

背景: 因为局域网内架设了 tiddlywiki、 Nextcloud 等服务,同时也把公司的网站架设在了本地,为了实现局域网直接在局域网内访问,而外部访问通过frps服务器作为反向代理的目的,才有此内容。 实现的效果如下图琐事 不喜欢…