集合无序,元素唯一,以[值,值]的形式存储元素

创建集合

function Set() {var items = {};/*判断值是否在集合中*/this.has = function(value) {return value in items;};/*this.has = function(value) {      //方法2return items.hasOwnProperty(value);};*//*添加新项*/this.add = function(value) {if (!this.has(value)) {items[value] = value;return true;    //表示添加新项}return false;       //表示没添加新项;};/*移除项*/this.remove = function(value) {if (this.has(value)) {delete items[value];return true;    //表示值被移除}return false;       //表示没有移除值};this.clear = function() {items = {};};/*集合所包含项数*/this.sizeLegacy = function() {var count = 0;for (var prop in items) {   //遍历属性(包含object类继承的)if (items.hasOwnProperty(prop)) {   //筛选出自己的属性count++;}return count;}};/*IE9+,其他浏览器可以,ECMAScript5*/this.size = function() {        //Object类的内建函数keys方法,返回一个包含给定对象所有属性的数组return Object.keys(items).length;};/*IE9+,其他浏览器可以,ECMAScript5*/this.values = function() {return Object.keys(items);};/*返回一个包含集合中所有值的数组*/this.valuesLegacy = function() {var keys = [];for (var key in items) {keys.push(key);}return keys;};
}

集合的操作

并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合

this.union = function(otherSet) {var unoinSet = new Set();var values = this.values();for (var i = 0; i < values.length; i++) {unoinSet.add(values[i]);}values = otherSet.values();for (var j = 0; j < values.length; j++) {unoinSet.add(values[j]); }return unoinSet;
};
  • 首先创建一个新的集合,代表两个集合的并集
  • 获取第一个集合的所有值,遍历并添加到代表并集的集合中
  • 同样操作第二个集合
  • 返回结果

使用如下:

var setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);var setB = new Set();
setB.add(3);
setB.add(4);
setB.add(5);
setB.add(6);var unoinAB = setA.union(setB);
console.log(unoinAB.values());  // ["1", "2", "3", "4", "5", "6"]

交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合

this.intersection = function(otherSet) {var intersectionSet = new Set();var values = this.values();for (var i = 0; i < values.length; i++) {if (otherSet.has(values)) {intersectionSet.add(values[i]);}}return intersectionSet;
};
  • 首先创建一个新的集合,代表两个集合的交集
  • 获取第一个集合的所有值,并验证他们是否也是第二个集合的值
  • 如果是,才添加到新集合中
  • 返回结果

差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合

this.difference = function(otherSet) {var differenceSet = new Set();var values = this.values();for (var i = 0; i < values.length; i++) {if (!otherSet.has(values[i])) {differenceSet.add(values[i]);}}return differenceSet;
};

子集:验证一个给定集合是否是另一个集合的子集

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

转载于:https://www.cnblogs.com/u14e/p/5331794.html

《学习javascript数据结构与算法》——第六章:集合相关推荐

  1. 读《学习JavaScript数据结构与算法》 第二章

    第二章 ECMAScript和TypeScript概述 文章目录 第二章 ECMAScript和TypeScript概述 前言 一.let const 二.模板字面量 支持换行 拼接方式 三.函数的默 ...

  2. 《学习JavaScript数据结构与算法》第三章 数组

    文章目录 前言 一.创建 && 初始化数组 二.操作数组 push-添加元素于末尾 unshift-添加元素于开头 pop-从数组末尾开始删除元素 shift-从数组开头开始删除元素 ...

  3. 重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

    定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构 ...

  4. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  5. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  6. 学习JavaScript 数据结构与算法

    学习链接:https://github.com/XPoet/js-data-structures-and-algorithms JavaScript 数据结构与算法 1.数据结构(data struc ...

  7. [翻译]C#数据结构与算法 – 第六章BitArray类

    BitArray类用于在资源有限的情况下表示一系列比特值.比特集合可以存储于常规数组,但是如果我们使用专为比特集合设计的数据结构则可以创建更高效的程序.在本章中,我们将学习一下怎样使用这种数据结构并研 ...

  8. 四大金刚 数据结构_学习JavaScript数据结构与算法(三):集合

    集合(Set遇新是直朋能到) 说起集合,就想起刚进高中时,数学第一课讲的就是集合.因此在学习集合这种数据结构时,倍感亲切. 集合的基本性质有一条: 集合中元素是不重复的.因为这种性质,所以我们选用了对 ...

  9. 《学习JavaScript数据结构与算法》 第四章笔记 栈

    文章目录 前言 一.栈? 二.构建两种栈的大致步骤 三.创建基于数组的栈 创建class Stack 定义用于操作栈的方法 使用栈 四.创建基于对象的栈 创建class Stack 定义用于操作栈的方 ...

最新文章

  1. pugixml库的一个使用心得
  2. Thinking in JAVA笔记——第三章 操作符 第四章控制执行流程
  3. sqlmap工具命令行的含义
  4. mysql 字符大对象_第02期:MySQL 数据类型的艺术 - 大对象字段
  5. 新手站长必须养成的五个好习惯
  6. 实战演示 Go 反射的使用方法和应用场景
  7. 尚展垒等编著c语言程序设计,C语言程序设计技术实践指导
  8. xss 全编码两次_XSS进阶
  9. python中错误和异常处理
  10. 吴裕雄--天生自然 高等数学学习:微分中值定理与导数的应用
  11. el-input点击事件
  12. 【CSP201803-1 】跳一跳,简单模拟
  13. php百度地图api的geocoder,百度地图API提供Geocoder类
  14. python爬取豆瓣电影并分析_Python爬虫入门 | 2 爬取豆瓣电影信息
  15. 矿山尾矿库倾斜摄影三维建模
  16. sql优化相关概念,explain的使用说明
  17. 有哪些建议给应届毕业生(转载知乎某大佬)
  18. Android 蓝牙 -- 还原网络设置 删除蓝牙所有存储配对信息流程分析---全网唯一
  19. Supermap iClient 展示与空间数据绑定的图片
  20. FAST-LIO2代码解析(六)

热门文章

  1. java未发现数据源名称并且未指定默认驱动程序_转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  2. java 旅行家的预算_旅行家的预算
  3. 毫秒级检测!你见过带GPU加速的树莓派吗?
  4. TensorFlow的Debugger调试实例
  5. Service Mesh 落地挑战
  6. CentOS 7 安装 中文字体
  7. 网络/系统调试维护笔记
  8. linux下拨号时间,linux下拨号上网
  9. java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...
  10. wpf treeview调整子菜单间距_完全由C编写,高度可移植,超级牛逼的菜单架构!...