JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)

简介: JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)

Set 简介

ES6 新增了数据结构 Set,与数组类似,特征如下:

  • 无序
  • 元素不能重复

Set 集合和 Array 数组的区别

  • Set 元素不能重复,Array 元素可以重复
  • Set 是无序结构,操作很快,Array 是有序结构,操作很慢
  • Set 没有下标的概念,无法通过下标读取元素,Array 可以通过下标读取元素
  • 操作 Set 的 API 和 Array 不同

Set 的基本操作

大部分 API 和 Map 相同

new —— 创建 Set

// 创建空集合
const s = new Set();

// 创建时赋值
const colors = new Set(['red',white,'blue']);

也可传入数组创建set,但若数组内存在相同元素,则会去重!

let list = [1, 2, 3, 3];
let my_set = new Set(list);

console.log(my_set);
// 打印 Set(3) { 1, 2, 3 }

注意:引用类型的数据地址不同,即便看起来值一样,也属于不同的数据!

let list = [
  {
    name: "朝阳",
  },
  {
    name: "朝阳",
  },
];
let my_set = new Set(list);

console.log(my_set);
// Set(2) { { name: '朝阳' }, { name: '朝阳' } }

add —— 添加元素

my_set.add(1)

若原 set 中已存在新添加的元素,则什么都不会发生,也不会报错。

delete —— 删除元素

my_set.delete(1)

若原 set 中不存在要删除的元素,则什么都不会发生,也不会报错。

数组中基于元素的索引 splice() 来删除元素,速度很慢。

clear —— 清空元素

my_set.clear()

has—— 查询是否存在目标元素

返回 true / false

if (my_set.has("name")) {
}
  • 数组中使用 indexOf() 或 includes() 查询是否存在目标元素是比较慢。
  • 数组无法使用 indexOf() 或 includes() 来查找 NaN
let list = [NaN, 1, 3];
let index = list.indexOf(NaN);

console.log(index); // 得到 -1
  • Set 可以通过 has 查找 NaN
let my_set = new Set([NaN, 2, 3]);

console.log(my_set.has(NaN)); // 得到 true

size —— 获取元素的数量

类似数组的 .length

my_set.size

遍历 Set

// 没有 index
my_set.forEach((val) => {
  console.log(val);
});

Set 的性能(与 Array 对比)

  • Set用于搜索、删除和插入元素的方法的时间复杂度都只有 O(1),即数据的大小实际上与这些方法的运行时间无关。
  • 数组搜索的时间复杂度为 O(N),运行时间的增长速度与数据大小的增长速度相同。

Set 的应用场景

Vue3 数据响应式 reactive 和 effect 的源码中,大量使用了 Set

数组去重

仅适用于简单数组

let oldList = [1, 2, 3, 3];
let newList = Array.from(new Set(oldList)); // 得到 [1, 2, 3]

let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
// [3, 5, 2]

提升数组类数据的操作性能

因 Set 操作数据的性能比 Array 好,当需要对数据进行频繁操作,且对数据顺序无需求时,可考虑改用 Set 提升性能!

目录
相关文章
|
1月前
|
编译器 API 定位技术
API和SDK的区别
API 和 SDK 的区别在于:API 是一组定义了软件组件之间交互规范的接口,用于实现不同软件组件之间的通信;而 SDK 是一个全面的工具集合,包含 API、编译器、调试器、文档等,用于特定平台的应用程序开发。SDK 范围更广,内容更丰富,更具体和具象化,适合复杂的开发需求;API 则更加抽象,侧重于功能的定义和调用方式。
|
1月前
|
人工智能 监控 负载均衡
一文详述:AI 网关与 API 网关到底有什么区别?
近年来,AI发展迅猛,大模型成为推动业务创新的关键力量。企业面临如何安全管理和部署AI应用的挑战,需设计既能满足当前需求又可适应未来发展的基础架构。AI网关应运而生,在集成、管理和优化AI应用中扮演重要角色。本文探讨AI网关与API网关的区别,分析AI系统为何需要专门网关,并提供选择合适AI网关的建议。AI网关不仅支持多种模型,还具备高级安全性和性能优化功能,有助于企业在复杂环境中灵活应用AI技术。
82 1
|
1月前
|
存储 JavaScript 前端开发
Set、Map、WeakSet 和 WeakMap 的区别
在 JavaScript 中,Set 和 Map 用于存储唯一值和键值对,支持多种操作方法,如添加、删除和检查元素。WeakSet 和 WeakMap 则存储弱引用的对象,有助于防止内存泄漏,适合特定场景使用。
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
34 1
|
30天前
|
编译器 API 定位技术
API和SDK的区别
API(应用程序编程接口)和SDK(软件开发工具包)的主要区别在于范围、内容、抽象程度及使用方式。API定义了软件组件间的交互规则,范围较窄,更抽象;而SDK提供了一整套开发工具,包括API、编译器、调试器等,范围广泛,具体且实用,有助于提高开发效率。
|
1月前
|
JavaScript 前端开发 安全
|
3月前
|
存储 Python
set() 和 freezeset() 之间有什么区别?
【8月更文挑战第29天】
28 6
|
3月前
|
Python
python中set和frozenset方法和区别
python中set和frozenset方法和区别
|
3月前
|
XML 安全 API
REST 和 SOAP API 有什么区别?
【8月更文挑战第31天】
178 0
|
3月前
|
存储 Java 索引