首页 > 其他分享 >ES6中的Set数据结构的常用方法和使用场景

ES6中的Set数据结构的常用方法和使用场景

时间:2024-10-22 12:48:58浏览次数:3  
标签:ES6 Set console ... let 集合 new 数据结构

ES6中的Set数据结构

Set 是 ES6 中新增的数据结构,用于存储不重复的值,允许存储任何类型的唯一值。Set 的核心特点是值唯一性,类似数学中的集合。

常用方法

1. add(value)

添加值到Set中,如果值已存在则不会添加。

const set = new Set();
set.add(1);  // Set {1}
2. delete(value)

删除指定值,返回布尔值,表示是否删除成功。

set.delete(1);  // true
3. has(value)

检查值是否存在于Set中,返回布尔值。

set.has(1);  // false
4. clear()

清空整个Set

set.clear();  // Set {}
5. size

返回Set中的元素数量。

set.size;  // 0
6. forEach(callback)

遍历Set,为每个值执行一次提供的回调函数。

let mySet = new Set([1, 2, 3, 4, 5]);

mySet.forEach(function(value, key) {
 	console.log('value: ' + value + ', key: ' + key);
});
7. 迭代器方法
  • keys()values(): 返回包含集合中元素的迭代器(Set 的键和值相同)。
  • entries(): 返回[value, value]格式的迭代器,适用于Map接口的兼容。
  • for...of: 遍历Set中的每个值。
let mySet = new Set([1, 2, 3, 4, 5]);

// 使用 .values()
for (let value of mySet.values()) {
console.log(value);
}

// 使用 .keys(),与 .values() 相同
for (let key of mySet.keys()) {
console.log(key);
}

// 使用 .entries()
for (let entry of mySet.entries()) {
console.log(entry); // 每个 entry 是一个 [value, value] 的数组
}
// 使用 for...of 循环来迭代其值
for (let value of mySet) {
console.log(value);
}

在这里插入图片描述
在这里插入图片描述

使用场景

1. 数组去重

利用Set的唯一性快速去重。

const arr = [1, 2, 2, 3];
const uniqueArr = [...new Set(arr)];  // [1, 2, 3]
2. 数据集合处理
  • 交集、并集、差集等操作可以通过Set简洁实现。
const setA = new Set([1, 2, 3]);
const setB = new Set([3, 4, 5]);

// 交集
const intersection = new Set([...setA].filter(x => setB.has(x)));  // Set {3}

// 并集
const union = new Set([...setA, ...setB]);  // Set {1, 2, 3, 4, 5}

// 差集
const difference = new Set([...setA].filter(x => !setB.has(x)));  // Set {1, 2}
3. 集合判定

检查一个集合是否包含特定值或操作两个集合之间的关系,如交集或子集操作。

检查集合是否包含特定值

使用 Sethas() 方法来检查集合中是否存在某个值。

let mySet = new Set([1, 2, 3, 4, 5]);

if (mySet.has(3)) {
  console.log("集合包含值 3");
} else {
  console.log("集合不包含值 3");
}
计算两个集合的交集

可以通过 filter() 方法结合 Set.prototype.has 来找出两个集合的交集。

let setA = new Set([1, 2, 3, 4, 5]);
let setB = new Set([4, 5, 6, 7, 8]);

let intersection = new Set([...setA].filter(x => setB.has(x)));

console.log(intersection); // 输出 Set { 4, 5 }
判断一个集合是否为另一个集合的子集

可以利用 every() 方法来确定一个集合是否是另一个集合的子集。

function isSubset(setA, setB) {
  return [...setA].every(element => setB.has(element));
}

let setX = new Set([1, 2]);
let setY = new Set([1, 2, 3, 4]);

console.log(isSubset(setX, setY)); // 输出 true
计算两个集合的并集

合并两个集合可以简单地使用 add() 方法或者利用扩展运算符。

let union = new Set([...setA, ...setB]);

console.log(union); // 输出 Set { 1, 2, 3, 4, 5, 6, 7, 8 }
计算两个集合的差集

计算两个集合的差集(即 A 中有而 B 中没有的元素),可以使用 filter() 方法。

let difference = new Set([...setA].filter(x => !setB.has(x)));

console.log(difference); // 输出 Set { 1, 2, 3 }
计算两个集合的对称差集

对称差集是指属于 A 或 B 之一但不属于两者都有的元素集合。

let symmetricDifference = new Set(
  [...setA].filter(x => !setB.has(x)).concat([...setB].filter(x => !setA.has(x)))
);

console.log(symmetricDifference); // 输出 Set { 1, 2, 3, 6, 7, 8 }
4. 性能优化

在ES6中,Set 对象可以用来提高某些操作的性能,特别是在需要去除重复项、快速查找以及进行集合操作的场景下。以下是几种使用 Set 进行性能优化的方法:

去除数组中的重复项

当需要从一个数组中去除重复的元素时,使用 Set 可以非常高效,因为它会自动保证元素的唯一性。

let arr = [1, 2, 2, 3, 4, 4, 5];
let uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // 输出 [1, 2, 3, 4, 5]
快速成员查找

由于 Set 的内部实现通常是基于哈希表的,因此 Sethas 方法可以提供接近 O(1) 的查找性能,这比在数组中使用 indexOf 或者 includes 方法要快得多。

let mySet = new Set([1, 2, 3, 4, 5]);
console.log(mySet.has(3)); // 输出 true
console.log(mySet.has(6)); // 输出 false
集合操作

使用 Set 可以更容易地实现集合的交集、并集、差集等操作,并且性能通常优于其他方式,尤其是当集合很大时。

并集(Union)

将两个集合的所有元素合并到一个新的集合中。

let setA = new Set([1, 2, 3]);
let setB = new Set([3, 4, 5]);
let union = new Set([...setA, ...setB]);
console.log(union); // 输出 Set { 1, 2, 3, 4, 5 }
交集(Intersection)

找出同时存在于两个集合中的元素。

let setA = new Set([1, 2, 3, 4, 5]);
let setB = new Set([4, 5, 6, 7, 8]);
let intersection = new Set([...setA].filter(x => setB.has(x)));
console.log(intersection); // 输出 Set { 4, 5 }
差集(Difference)

找出一个集合中有而另一个集合中没有的元素。

let setA = new Set([1, 2, 3, 4, 5]);
let setB = new Set([4, 5, 6, 7, 8]);
let difference = new Set([...setA].filter(x => !setB.has(x)));
console.log(difference); // 输出 Set { 1, 2, 3 }
存储唯一对象

如果需要存储一组唯一的对象(比如用户ID),可以将对象的唯一标识作为字符串存储在 Set 中,这样可以避免存储重复的对象。

let users = [
  { id: 'alice', name: 'Alice' },
  { id: 'bob', name: 'Bob' },
  { id: 'alice', name: 'Alice' } // 重复项
];

let uniqueUsersIds = new Set(users.map(user => user.id));
console.log(uniqueUsersIds); // 输出 Set { 'alice', 'bob' }

总结

Set 是处理唯一性问题、集合操作以及优化性能的有力工具,适合用于集合操作、数据去重、快速查找等场景。

使用 Set 可以有效地提升代码性能,尤其是在处理大量数据时,利用 Set 的特性和方法可以简化逻辑并提高运行效率。不过,需要注意的是,虽然 Set 在很多情况下提供了优秀的性能表现,但在某些特定场景下,可能还需要考虑其他数据结构或者算法来进一步优化。

标签:ES6,Set,console,...,let,集合,new,数据结构
From: https://blog.csdn.net/misstianyun/article/details/143138086

相关文章

  • 磁致伸缩位移传感器 Profibus信号设置从站地址(set slave address)实例
    工具:1.一台个人电脑(PC)2.一张西门子 SIMATIC CP5611介面卡3.西门子 SIMATIC Manager 软体程序:1.把西门子 CP5611介面卡安装到电脑主机底板上,并安装驱动程序。2.检查驱动程序是否成功安装: “控制面板”->“系统”->“硬体”->“设备管理器”。设备管理......
  • SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1
    启动springboot项目时,出现了以下报错:defaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDjava.lang.IllegalStateException:Failedtoloadpropertysourcefromlocation'classpath:/application-local.yaml' atorg.springframework......
  • 【题解】Solution Set - NOIP2024集训Day58 字符串
    【题解】SolutionSet-NOIP2024集训Day58字符串https://www.becoder.com.cn/contest/5658「CF1466G」SongoftheSirens考虑对于\(s_i\),算钦定必须覆盖到\(t_i\)的匹配个数\(f_i\)。注意到\(s\)每次长度都会\(\times~2\)左右,其长度在\(O(\log|w|)\)的时候就......
  • Java数据结构---顺序表
    目录一、线性表二、顺序表2.1、顺序表的定义 2.2、顺序表的接口实现三、ArrayList3.1、 ArrayList简介3.2、ArrayList的实现 3.3、ArrayList实现的完整代码一、线性表线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用......
  • 考研数据结构-栈
    (一)、栈的基本概念     栈是一种只能在一端进行插入或者删除操作的线性表。允许插入或者删除的一端称为栈顶。栈顶由一个称为栈顶指针的位置指示器(是一个变量,对于顺序栈,就是记录栈顶元素所在数组位置符号的一个整型变量;对于链式栈,就是记录栈顶元素所在结点地址的指......
  • (multi)map和set--C++
    文章目录一、序列式容器和关联式容器二、set系列的使用1、set和multiset参考文档2、set类的介绍3、set的构造和迭代器4、set的增删查5、insert和迭代器遍历使用样例:6、find和erase使用样例:7、multiset和set的差异三、map系列的使用1、map和multimap参考文档2、map类的介......
  • 数据结构-双向链表
    一概念与结构带头双向循环链表注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,带头链表⾥的头结点,实际为“哨兵位”,哨兵位结点不存储任何有效元素,只是站在这⾥“放哨的。如果,带头的链表中,只有头节点,我们就称该链表为空链表。二双向链表的实现创建一个新项目,并创......
  • ES6-模块化
    介绍模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。模块化的好处防止命名冲突代码复用高维护性ES6之前的模块化规范有CommonJS=>NodeJS、BrowserifyAMD=>requireJSCMD=>seaJSES6模块化语法模块功能主要由两个命令构成:export和im......
  • 数据结构——队列
    目录1>>导言2>>队列的结构3>>初始化4>>打印5>>入列6>>出列6.1>>判断是否为空7>>取队头和队尾数据and统计个数8>>队列销毁9>>三个文件代码queue.hqueue.ctest.c10>>总结1>>导言    在把栈学习完后,步入新的章节——队列,队列是一种特殊的线性表,队列是......
  • ES6-Class
    class类ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。知识点:......