JS 数据结构:集合

news2025/7/14 3:23:00

集合

集合是由一组无序且唯一(即不能重复)的项组成的。该数据结构使用了与有限集合相同的数学概念。ES6 JS 原生实现了集合 Set 数据结构(具体看这篇文章JS Set 与 weakSet),但是没有取两集合交集、并集、差集的 API ,所以本篇博客就自己实现一个集合并实现原生集合未实现的操作。

集合 API

定义集合

这里底层我们使用对象(使用数组也可以),使用对象的原因是为了更好的模拟 Set 的行为。

class MySet {
  constructor() {
    this.items = {};
  }
}

检验某个元素是否存在于集合中

因为是对象,所以我们可以使用 in 运算符,in 运算符会返回某个属性是否在对象及其原型链上,存在返回 true,否则返回 false。

// 检验某个元素是否存在于集合中
  has(item) {
    return item in this.items;
  }

添加、删除、清空

添加:因为集合内元素唯一,所以新增元素前需要先判断集合中是否由该元素。
删除:依然需要先判断集合中是否由该元素,有才能删除。
清空:因底层使用对象,所以清空直赋值空对象就好了。

// 添加元素
  add(item) {
    if (!this.has(item)) {
      this.items[item] = item;
      return true;
    }
    return false;
  }
  // 删除元素
  delete(item) {
    if (!this.has(item)) {
      delete this.items[item];
      return true;
    }
    return false;
  }
  // 清空集合
  clear() {
    this.items = {};
  }

获取集合元素的数量

我们使用for in便利对象的属性,但是由于for in会遍历所有的可迭代对象(包括原型链上的),所以需要使用hasOwnProperty方法判断一下当前属性是否是对象本身的属性。size 方法中是 count 才加一,最后返回 count 就是元素的数量了。values 方法中是才将当前属性值添加到结果数组中。

// 获取集合元素的数量
  size() {
    let count = 0;
    for (let key in this.items) { // {2} 
      if (this.items.hasOwnProperty(key)) { // {3} 
        count++; // {4} 
      }
      return count;
    };
  }
  // 以数组的形式返回所有元素
  values() {
    let values = [];
    for (let key in this.items) { // {1} 
      if (this.items.hasOwnProperty(key)) {
        values.push(key); // {2} 
      }
    }
    return values;
  };

并集

两集合并集

给定的两个集合,返回一个包含两个集合中所有元素的新集合。
在这里插入图片描述

// 并集
  union(set) {
    const resSet = new Set();
    this.values().forEach(value => resSet.add(value));
    set.values().forEach(value => resSet.add(value));
    return resSet;
  }

多集合并集

给定的多个集合,返回一个包含所有集合中所有元素的新集合。

//多集合并集
  unionMany(...sets) {
    const resSet = new Set();
    this.values().forEach(value => resSet.add(value));
    sets.forEach(set => {
      set.values().forEach(value => resSet.add(value));
    })
    return resSet;
  }

交集

两集合交集

给定的两个集合,返回一个包含两个集合中共有元素的新集合。
在这里插入图片描述

 // 交集
  intersection(set) {
    const resSet = new Set();
    const values = this.values();
    for (let i = 0; i < values.length; i++) {
      if (set.has(values[i])) {
        resSet.add(values[i]);
      }
    }
    return resSet;
  }

多集合交集

给定的多个集合,返回一个包含所有集合中共有元素的新集合。

// 多集合交集
  intersection(...sets) {
    const resSet = new Set();
    const values = this.values();
    for (let i = 0; i < values.length; i++) {
      resSet.add(values[i]);
    }
    for (let i = 0; i < values.length; i++) {
      for (let set of sets) {
        if (!set.has(values[i])) {
          resSet.delete(values[i]);
        }
      }
    }
    return resSet;
  }

差集

给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
在这里插入图片描述

// 差集
  difference(set) {
    const resSet = new Set();
    this.values().forEach(value => {
      if (!set.has(value)) {
        resSet.add(value);
      }
    });
    return resSet;
  }

判断是否子集

验证一个给定集合是否是另一集合的子集。给定集合的所有元素都能在另一个集合中找到。

  // 子集
    // 子集
  isSubsetOf(set) {
    if (this.size() > set.size()) {
      return false;
    }
    let isSubset = true;
    this.values().every(value => {
      if (!set.has(value)) {
        isSubset = false;
        return false;
      }
      return true;
    });
    return isSubset;
  }
}

集合的操作就这么多了,我是孤城浪人,一名正在前端路上摸爬滚打的菜鸟,欢迎你的关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记之高斯网络(二)高斯贝叶斯网络

机器学习笔记之高斯网络——高斯贝叶斯网络引言回顾高斯网络贝叶斯网络&#xff1a;因子分解高斯贝叶斯网络&#xff1a;因子分解引言 上一节介绍了高斯网络及其条件独立性&#xff0c;本节将介绍高斯贝叶斯网络。 回顾 高斯网络 高斯网络最核心的特点是&#xff1a;随机变…

SpringBoot 多点互斥登录(web应用安全) 保姆级教程

1.什么是互斥登录 在实际生活中&#xff0c;很多网站都做了多点登录互斥的操作&#xff0c;简单来说就是同一个账号&#xff0c;只能在一台电脑上登录&#xff0c;如果有人在其他地方登录&#xff0c;那么原来登录的地方就会自动下线&#xff0c;再进行操作就会弹出登录界面。 …

【远程调用 MySQL数据库并操作】——使用NATAPP搭建内网穿透远程访问MySQL数据库并使用 Python新建、写入、读取、删除数据【详细版】

所有的程序都是免费的&#xff01;&#xff01; Python MySQL NATAPP 点个赞留个关注吧&#xff01;&#xff01; NATAPP 安装使用教程 官网 NATAPP 下载 官网 NATAPP配置教程 1、进入NATAPP 登录/注册 进行登录&#xff0c;没有的注册一下&#xff0c;需要实名认证哦&am…

python基础之字符串

文章目录一、字符串定义二、字符串相关使用三、空白字符表示哪些&#xff1f;四、实例1.要求&#xff1a;顺序并且居中对齐输出以下内容2.要求&#xff1a;1.将字符串中的空白字符全部删去&#xff1b;2.再使用“ ”作为分隔符&#xff0c;拼接成一个整齐的字符串五、字符串的切…

【vscode】远程云主机的报错

win11 之前在另一台电脑上的vscode是可以的 新电脑拷贝了vs的配置&#xff0c;但是远程不行了。 Install terminal quit with output: 过程试图写入的管道不存在。 发现连接不到远程以为是konw hosts 的问题&#xff0c; 删除了要访问ip的内容&#xff0c;还是不行&#x…

网络程序设计——异步选择模型(基于消息的选择、基于事件的选择)

目录 一、异步选择模型 1、基于消息的选择模型 &#xff08;1&#xff09;WSAAsyncSelect模型 &#xff08;2&#xff09; WSAAsyncSelect()函数 &#xff08;3&#xff09;使用 WSAAsyncSelect模型接收数据的过程 &#xff08;4&#xff09;WSAAsyncSelect模型的编程方法…

IDEA常用插件

笔记来源于B站视频 以下为视频的地址 【【尚硅谷】IDEA2022全新版教程&#xff0c;兼容JDK17&#xff08;快速上手Java开发利器&#xff09;】https://www.bilibili.com/video/BV1CK411d7aA?p26&vd_source581d732b20cb23e01428068f153a99ed 推荐1&#xff1a;Alibaba J…

MCE丨重组蛋白常见的融合标签

Q&#xff1a;什么是融合标签&#xff1f; A&#xff1a;融合标签是指利用 DNA 体外重组技术&#xff0c;在目的蛋白 N 端或 C 端进行融合表达的特定蛋白、多肽或寡肽标签。 Q&#xff1a;融合标签有什么作用&#xff1f; A&#xff1a;重组蛋白通过融合标签与包被在固相基质上…

第六章《类的高级特性》第5节:接口

在Java语言中,一个类只能继承一个父类,专业上把这种继承机制称为“单继承”。单继承是一种较为稳妥继承机制,能够规避很多潜在的问题,但这种继承机制的局限性也显而易见:子类不能从多个父类中继承属性和方法,从而无法最大程度的减少重复劳动。为了弥补这个缺陷,Java语言…

web前端-javascript-关系运算符(>、>=、<、<=、非数值,Unicode 编码说明)

文章目录关系运算符1. 说明2. > 大于号3. > 大于等于4. < 小于号5. < 小于等于6. 非数值的情况6.1. 对于非数值进行比较时&#xff0c;会将其转换为数字然后再比较6.2. 如果符号两端都是字符串时&#xff0c;不会将其转换为字符串进行比较6.3. 任何值和 NaN 做任何…

为什么单线程的Redis如此的快(Why is single-threaded Redis so fast)

视频地址&#xff1a;YouTube Why is Redis so fast? What fundamental design decisions did the developers make more than a decade ago that stood to test of time. Let’s take a look. Redis is a very popular in-memory database. It’s rock solid, easy to use, a…

HittER: Hierarchical Transformers for Knowledge Graph Embeddings

HittER: Hierarchical Transformers for Knowledge Graph Embeddings HittER由两部分组成&#xff1a; 1&#xff0c;底部&#xff1a;Entity Transformer 源实体的局部邻居的每个实体-关系对的特征提取。负责将实体关系对中所有有用特征打包成向量&#xff0c;以供顶部块使用…

mysql基础部分第一次复习(1-8章,到聚合函数)

基本的使用 show databases; create database 数据库名; //创建数据库 use 数据库名&#xff1b; //使用数据库 使用完use语句之后接下来的SQL操作都是针对当前数据库的了show tables; //查看某个数据库的所有表格 show tables from 数据库名&#xff1b;create table 表名称{…

C++--智能指针--1123

1.智能指针解决的问题 int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; } void Func() { // 1、如果p1这里new 抛异常会导致p1不会Delete而导致内存泄漏 // 2、如果p2这里new 抛异常会导致p1和p2都不会de…

【数据结构学习笔记】18:线段树(单点修改)

1 线段树上的操作 push_up(int u)&#xff1a;由子节点的信息去计算父节点的信息&#xff0c;例如两个子节点的区间和&#xff0c;加起来就是父节点表示的区间和。其中u是当前节点编号&#xff0c;表示用u的左右两个子节点来算一下自己这个节点的信息。push_down&#xff1a;将…

流氓设备检测和预防

自带设备 &#xff08;BYOD&#xff09; 策略中涉及的设备以及这些设备连接到的端口具有多个通信路径。确保这些设备及其路径在进入组织网络时立即被检测、评估和管理至关重要&#xff0c;因为非托管设备很容易成为安全风险。但是&#xff0c;在整个企业网络中同时添加许多设备…

反射、枚举、lambda——小记

文章目录反射反射定义反射相关的类Class 类反射示例获得Class对象的三种方式反射使用 ——代码面试题:你知道有几种创建对象的方式吗?反射优点和缺点枚举Lambda表达式概念Lambda表达式的语法代码反射 反射定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态…

路由策略和路由控制

路由策略和路由控制 路由策略 针对路由的发布&#xff0c;接收&#xff0c;引入进行控制&#xff0c;从而影响数据的路径或者可达性 路由匹配工具 ACL&#xff1a;访问前缀列表 一个ACL用多条规则组成&#xff0c;不同规则之间通过rule id进行区分&#xff0c;默认rule 步…

(附源码)python办公数据分析系统 毕业设计 021836

Python办公数据分析系统 摘 要 现代办公通过办公自动化系统可以大大提高的效率、节省成本、规范业务和流程&#xff0c;辅助提升管理水平。办公系统在单位信息化中占有非常重要的地位&#xff0c;涉及到单位的各个部门及绝大多数人员&#xff0c;流程和协作方面要求非常强。 办…

[附源码]java毕业设计英语知识竞赛报名系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…