javascript 集合(set)算法与说明

一文搞懂Set集合:从原理到多语言实战与常见报错排查 数据结构是编程的基石,Set作为重要的抽象数据类型,以元素唯一性和高效查找著称。它通常基于哈希表实现,提供平均O(1)的插入、删除与查找性能,因此被广泛用于数据去重、集合运算、标签系统等场景。无论面试还是日常开发,掌握Set都能显著简化代码并提升效率。本文从集合的核心概念出发,深入剖析哈希原理与去重机制,系统对比Python、Java、C++、JavaScript四种主流语言的Set用法,并通过用户标签系统实战演示交集、并集等操作,同时讲解SQL中UPDATE SET语句的安全实践以及环境变量配置类报错的排 阅读详情

集合的介绍

集合是由一组无序且唯一(即不能重复)的项组成的。这个和数学的概念很相同有交集、并集和差集等。

增删改查的算法:

let set = new Set();

set.add(1);
set.values(); // [1]
set.has(1);//true
set.size();//1

set.add(2);
set.values(); //[1, 2]

set.delete(1);
set.values(); //[2]

set.delete(2);
set.values(); //[]

set类在本文最底部。


并集

若A和B是集合,则A和B并集是有所有A的元素和所有B的元素,而没有其他元素的集合。A和B的并集通常写作 “A∪B”,读作“A并B”,用符号语言表示,即:A∪B={x|x∈A,或x∈B}



并集的方法实现:

function union(otherSet){
        let unionSet = new Set(); 

        let values = this.values(); 
        for (let i=0; i<values.length; i++){
            unionSet.add(values[i]);
        }

        values = otherSet.values();
        for (let i=0; i<values.length; i++){
            unionSet.add(values[i]);
        }

        return unionSet;
};



并集的用法:

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);

let setB = new Set();
setB.add(3);
setB.add(4);
setB.add(5);
setB.add(6);

let unionAB = setA.union(setB);

交集

设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection)。即:A∩B= {x|x∈A∧x∈B}。



交集的方法实现:

function intersection(otherSet){
     let intersectionSet = new Set(); 

     let values = this.values();
     for (let i=0; i<values.length; i++){ 
         if (otherSet.has(values[i])){    
             intersectionSet.add(values[i]); 
         }
     }

     return intersectionSet;
 };



交集的用法:

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);

let setB = new Set();
setB.add(3);
setB.add(4);
setB.add(5);
setB.add(6);

let unionAB = setA.union(setB);

差集

一般地,记A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做集合A减集合B(或集合A与集合B之差),类似地,对于集合A、B,我们把集合{x∣x∈A,且x∉B}叫做A与B的差集,



差集的方法实现:

function difference(otherSet){
    let differenceSet = new Set(); 

    let values = this.values();
    for (let i=0; i<values.length; i++){ 
        if (!otherSet.has(values[i])){    
            differenceSet.add(values[i]); 
        }
    }

    return differenceSet;
};



差集的用法:

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);

let setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);

let differenceAB = setA.difference(setB);

子集

子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。
符号语言:若∀a∈A,均有a∈B,则A⊆B



子集的方法实现:

function subset(otherSet){
    if (this.size() > otherSet.size()){ 
        return false;
    } else {
        let values = this.values();
        for (let i=0; i<values.length; i++){ 
            if (!otherSet.has(values[i])){   
                return false; 
            }
        }
        return true;
    }
};



子集的用法:

let setA = new Set();
setA.add(1);
setA.add(2);

let setB = new Set();
setB.add(1);
setB.add(2);
setB.add(3);

let subsetAB =setA.subset(setB);

ES6集合完整实现代码:

let Set = (function () {

    const items = new WeakMap();

    class Set {

        constructor () {
            items.set(this, {});
        }

        add(value){//向集合添加一个新的项
            if (!this.has(value)){
                let items_ = items.get(this);
                items_[value] = value;
                return true;
            }
            return false;
        }

        delete(value){//删除集合一个特定项
            if (this.has(value)){
                let items_ = items.get(this);
                delete items_[value];
                return true;
            }
            return false;
        }

        has(value){//查找集合中的值,有返回true,没有返回false。
            let items_ = items.get(this);
            return items_.hasOwnProperty(value);
        }

        clear(){//移除集合中所有的项
            items.set(this, {});
        }

        size(){//返回集合所包含元素的数量。
            let items_ = items.get(this);
            return Object.keys(items_).length;
        }


        values(){//返回一个包含集合中所有的值的数组。
            let values = [];
            let items_ = items.get(this);
            for (let i=0, keys=Object.keys(items_); i<keys.length; i++) {
                values.push(items_[keys[i]]);
            }
            return values;
        }

        getItems(){//返回集合
            return items.get(this);
        }

        union(otherSet){//并集,返回一个集合
            let unionSet = new Set();

            let values = this.values();
            for (let i=0; i<values.length; i++){
                unionSet.add(values[i]);
            }

            values = otherSet.values();
            for (let i=0; i<values.length; i++){
                unionSet.add(values[i]);
            }

            return unionSet;
        }

        intersection(otherSet){//交集,返回一个集合
            let intersectionSet = new Set();

            let values = this.values();
            for (let i=0; i<values.length; i++){
                if (otherSet.has(values[i])){
                    intersectionSet.add(values[i]);
                }
            }

            return intersectionSet;
        }

        difference(otherSet){//差集,返回一个集合
            let differenceSet = new Set();

            let values = this.values();
            for (let i=0; i<values.length; i++){
                if (!otherSet.has(values[i])){
                    differenceSet.add(values[i]);
                }
            }

            return differenceSet;
        };

        subset(otherSet){//子集,返回一个集合

            if (this.size() > otherSet.size()){
                return false;
            } else {
                let values = this.values();
                for (let i=0; i<values.length; i++){
                    if (!otherSet.has(values[i])){
                        return false;
                    }
                }
                return true;
            }
        };
    }
    return Set;
})();
JavaScript Map和Set:高效键值存储与集合操作的核心原理与工程实践 Map和Set是JavaScript中基于哈希表实现的原生数据结构,分别提供O(1)平均时间复杂度的键值映射与成员存在性判断能力。其核心原理依赖SameValueZero相等算法,支持任意类型键(包括对象、函数、NaN)并严格遵循引用相等语义,显著区别于Object的字符串键限制和Array的线性查找性能瓶颈。技术价值体现在内存安全(如WeakMap防泄漏)、语义清晰(如Set天然去重与集合运算)、迭代友好(原生支持for...of与扩展运算符)及可扩展性强(可继承定制TTL缓存)。典型应用场景涵盖前端缓存 阅读详情

相关推荐

5G NR 物理层 流程一:从帧结构到TB块,PDSCH/PUSCH 资源映射与TBS计算实战

本文详细解析了5G NR物理层流程,从帧结构到TB块的计算,重点介绍了PDSCH/PUSCH资源映射与TBS计算的实战方法。通过具体案例和公式推导,帮助工程师掌握5G NR资源分配、MCS选择及TBS量化过程,解决实际部署中的常见问题。

weixin_30897233的博客 94

python 中set集合类型(去重、成员运算)

集合类型的作用:去重以及成员运算 # 第一种、创建集合,使用花括号{},打印默认去重 one_set = {10, 20, 33, 10, 22, 33, 20} print(one_set) # 第二种、创建集合,使用花括号set({值}),打印默认去重 two_set = set([10, 10, 20, 44, 10, 66, 44, 20]) print(two_set) # 创建空集合 # 不能使用{}来创建空集合,默认创建的是空字典 empty_set = set() print(type(

Python热爱者的博客 859

手机相机基础技术解析:从硬件到算法的全面指南

手机相机的成像过程可简化为的链路,其核心硬件包括 镜头、CMOS传感器、ISP(图像信号处理器) 以及配套的软件算法。

weixin_44239603的博客 2447

JavaScript中Set的使用

在ES6之前,我们主要使用数组、对象来存储数据;在ES6中新增了另外两种数据结构:Set、Map和WeakSet、WeakMap。Set有点类似于Array数组,但是和数组的区别是Set的元素不能重复。先不考虑Set的创建方法,通过案例来演示Set和Array数组的区别。我们需要通过Set的构造函数创建Set(没有字面量创建的方式)...............

m0_51636525的博客 1万+

Django 前后端分离实战:网络设备运维系统 - 从登录认证到业务模块

这篇文章分享了Django+Vue前后端分离开发网络设备运维系统的实战经验,重点介绍了登录认证、全局布局和设备管理三大模块的实现。文章包含以下核心内容: 登录模块实现:包括表单验证、Token认证、记住密码功能,以及美观的UI设计(渐变背景、毛玻璃效果) 全局布局架构:采用侧边栏+顶部导航的响应式设计,支持菜单权限控制和多设备适配 业务功能开发:详细展示了设备分类和部门管理的CRUD功能实现,包括列表展示、搜索过滤、分页等功能 常见问题解决:提供了5个开发中常见问题的解决方案,如Vue Router警告、C

qq_16766705的博客 525

七天征服AutoSAR/SomeIP_04理解SoAD_LdCom_SD模块

本文深入解析了AUTOSAR平台下SOME/IP协议栈的架构设计与模块交互逻辑。重点剖析了SD模块(服务发现)和LdCom模块(通信适配层)与SoAD(Socket适配层)之间的复杂关联关系。文章通过详细配置表格和代码示例,阐述了服务注册发现机制、PDU路由控制策略、数据收发流程等核心功能,并形象地将三模块关系类比为"三极管结构"。特别强调了SD模块通过RoutingGroup实现通信路径的动态开关控制,以及LdCom模块在协议栈中的透传转发作用,帮助开发者理解配置规则背后的底层原理,提

大叔带刺的博客 194

JavaScript---Set数据结构

JS---set1. 什么是 set2. set 构造函数2.1) 数组2.2) 字符串2.3) arguments2.4) NodeList2.5)  Set3. Set 的实例属性和方法 1. 什么是 set set 可以简单的看作是数学上的集合。 它是一系列无序,没有重复数值的数据集合。 2. set 构造函数 对于 set 的构造函数的参数,可以传递以下几种形式。 2.1) 数组 const s = new Set([1, 2, 1]); console.log(s); 这里传递了一个数组[

CSPsy的博客 3358

第42章:AI代码生成的质量标准——何时用AI、何时自己写

> - AI代码生成的质量分级标准:可用、稳定、安全、优雅 > - 一个决策矩阵:什么场景适合用AI,什么场景必须人工编写 > - 如何评估AI生成的代码质量(复杂度、可读性、安全性) > - 实战对比:同一需求下AI生成代码 vs 人工编写代码 > - 团队落地:将质量标准集成到Code Review和CI流程 > - 我如何将团队AI代码接受率从70%提升到90%

sfishfly的博客 161

(模板)线段树set(a,b) query(a,b)

#include #include #define MAX_N 100000 #define INF (-(MAX_N)) typedef float Type; int ol,or; Type _min,_max,_sum,v; Type sumv[MAX_N],minv[MAX_N],maxv[MAX_N],addv[MAX_N],setv[MAX_N]; Type max(Type

SapphireStart 886

Cadence PSpice 仿真11:电感型低通滤波器最坏情况分析仿真实战图文教程

在进行蒙特卡罗分析时会将元器件的容差考虑进去,然后通过运行多次的随机仿真,得到电路输出的一个范围。但是多数情况下设计师关注的只是电路的最坏情况是否满足设计要求。PSpice的最坏情况分析是取在容差的边界点元件参数进行仿真以计算出电路输出的最坏情况。所以如果如果电路中有10个元件的话,需要先取10个元件的标准值仿真1次,然后再分别在10个元件的容差边界处各仿真1次,然后再对仿真结果进行统计和计算,再最坏情况下再仿真1次。

fydar的博客 1944

ComfyUI整合包、秋叶ComfyUI、Florence节点报错下载并加载Florence2模型No module named ‘timm.layers‘、ComfyUI报错解决

步骤操作1打开2地址栏输入cmd并回车3输入命令:4安装完成后重新打开 ComfyUI,执行工作流,即可解决报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1240

JavaScript 中 Set 和 Map 的详细讲解

Set具有唯一性、无序性、可迭代。Set 可以存储任意类型的值(包括基本类型和引用类型)。 Map是键值对存储,Map 的键可以是任意类型(包括对象、函数等),Map 会记住键值对的插入顺序,Map 在频繁增删键值对的场景下性能更好。

露西西⭐的博客 2630

【原理图PCB专题】Cadence 17.4版本导出excel版本坐标文件

Cadence 17.4版本导出坐标文件往往都是txt格式,并且无标题、导出时间、导出设计工程多名称等信息。那么怎么样才能导出有带这些信息的excel版本并格式好看的坐标文件呢?

一点硬件 2763

ES6之什么是Set&Map?

为什么要使用 Set,以及 Map? 在说 Set,Map 之前,我们先来了解一个概念,叫做集合。Map 和 Set 的 产生原因来自于集合。那什么是集合呢? 集合的定义: 计算机科学中,集合是一组可变数量的数据项(也可能是 0 个)的组合, 这些数据项可能共享某些特征,需要以某种操作方式一起进行操作。一般 来讲,这些数据项的类型是相同的,或是满足相同的条件,或者遵循相同 的规则。 集合的特...

weixin_40851188的博客 400

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

带键的集合(Map 和 Set 对象)

对象的一个用例是存储一个对象的私有数据或隐藏实现细节。所有暴露出的原型和实例都是公开的,而其他内容都是外界不可访问的,因为模块并未导出。不允许观察其键的有效性,这也是它不允许枚举的原因。对象就是一个简单的键/值对映射集合,可以按照数据插入时的顺序遍历所有的元素。中的相应值也会被垃圾收集,只要它们没有在其他地方被强引用。,因为非注册 symbol 保证是唯一的,并且不能被重新创建。,并且不会对其键创建强引用。键的原始类型类型是 symbol,更具体地说,是。对象是一组唯一值的集合,可以按照添加顺序来遍历。

m0_52951519的博客 844

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

如何用 add 与 delete 动态管理 Set 集合中的唯一成员

add和delete必须配合new Set()创建的实例使用,不能用于数组或普通对象;基本类型(string/number/boolean/null/undefined)按值比较,安全对象、数组、函数按引用比较,每次 new Object() 都是新成员如果要基于内容去重对象,得自己封装逻辑(比如用 JSON.stringify + Map 缓存),Set 原生不支持delete 方法只删值,不关心索引或顺序,且对不存在的值返回 falseSet 没有索引概念,delete 接收的是具体值,不是位置。

a951141642的博客 154

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JavaScript内置数据结构

没有"最好"的数据结构,只有"最适合"的数据结构。理解每种结构的特点和适用场景,根据具体需求做出明智选择!

wuhen_n的博客 1049

LeetCode JS 常用辅助数据结构

/ 本地必须手写,LC内置不用写// 数组转链表(造测试用例)// 链表转数组(打印调试)while(p) {p = p.next;return res;// 测试。

m0_47999208的博客 279

JavaScript进阶之浅谈Set集合

JavaScript进阶之浅谈Set集合Set集合概述Set集合的属性和方法(常用)size属性add方法delete方法has方法clear方法forEach方法 Set集合概述 Set集合和Arry数组很相似,但是Set集合存储的是key也就是说Set集合中不可以存在两个值和数据类型都相等的key Set集合不可以用下标取值 Set集合没有length属性而是size Set集合可以通过Ar...

YXGR 2574

JavaScript集合类型终极指南:core-js中Map与Set的增强功能详解

在现代JavaScript开发中,高效的数据管理离不开强大的集合类型。作为JavaScript标准库的重要补充,core-js为原生Map和Set提供了丰富的增强功能,让数据操作更高效、代码更简洁。本文将深入探索core-js如何扩展Map与Set的能力,帮助开发者掌握这些实用工具提升开发效率。 ## 🌟 Map的超级能力:从基础到进阶 ### 一键获取或插入:getOrInsert方法

gitblog_01010的博客 690

js的set集合的处理

Set 有何不同 最根本的区别是数组是一个索引集合,这说明数组中的数据值按索引排序。 const arr = [A, B, C, D]; console.log(arr.indexOf(A)); // Result: 0 console.log(arr.indexOf(C)); // Result: 2 相比之下,set是一个键的集合。set不使用索引...

你如今的气质里,藏着你走过的路,经历过的事,读过的书,和爱过的人。 1万+

JS | 知识点总结 - Map 键值对 和 Set 集合 、WeakMap和WeakSet 等对比

名称类型是否弱引用键/值限制可被 GC 自动移除可枚举(forEach等)Map键值对❌ 否键任意类型❌ 否✅ 是WeakMap键值对✅ 是键必须是对象✅ 是❌ 否Set值集合❌ 否任意类型值❌ 否✅ 是WeakSet值集合✅ 是值必须是对象✅ 是❌ 否。

weixin_42479421的博客 607

JS实现集合Set的相关算法

两个数组的交集 给定两个数组,编写一个函数来计算它们的交集 示例: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 Set和Array //执行用时 :56 ms, 在...

YanMeiHe的博客 310

JavaScript易混淆知识点——Set、Map

说明:易混淆知识点是指不同于基本数据结构的知识点。

kellyvv130的博客 1233

四大金刚 数据结构_JavaScript数据结构与算法之集合(Set)

集合(Set)说起集合,就想起刚进高中时,数学第一课讲的就是集合。因此在学习集合这种数据结构时,倍感亲切。集合的基本性质有一条: 集合中元素是不重复的。因为这种性质,所以我们选用了对象来作为集合的容器,而非数组。虽然数组也能做到所有不重复,但终究过于繁琐,不如集合。集合的操作集合的基本操作有交集、并集、差集等。这儿我们介绍JavaScipt集合中交集、并集、差集的实现。JavaScipt中集合的实...

weixin_28885435的博客 227
上一篇: javascript 字典(dictionary)算法与说明
下一篇: javascript 散列表(Hashes)算法与说明
JarunWang
博客等级 码龄18年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值