1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>集合</title>
  5. <meta charset="utf-8">
  6. <script type="text/javascript">
  7. function Set(){
  8.  
  9. let items = {};
  10.  
  11. // add:添加一个新的项
  12. this.add = function(value){
  13. if(!this.has(value)){
  14. // 添加一个值的时候,把它同时作为键和值保存,有利于查找这个值
  15. items[value] = value;
  16. return true;
  17. }
  18. return false;
  19. };
  20.  
  21. // delete:删除值
  22. this.delete = function(value){
  23. if(this.has(value)){
  24. delete items[value];
  25. return true;
  26. }
  27. return false;
  28. };
  29.  
  30. // has:如果值在集合中返回true,否则返回false
  31. this.has = function(value){
  32. return items.hasOwnProperty(value);
  33. };
  34.  
  35. // clear:移除集合中的所有项
  36. this.clear = function(){
  37. items = {};
  38. };
  39.  
  40. // size:返回集合中所包含的元素数量,与数组的length属性类似
  41. this.size = function(){
  42. return Object.keys(items).length;
  43. };
  44.  
  45. // sizeLegacy:跨浏览器兼容返回集合元素数量
  46. this.sizeLegacy = function(){
  47. let count = 0;
  48. for(let key in items){
  49. if(items.hasOwnPrototype(key)){
  50. ++count;
  51. }
  52. }
  53. return count;
  54. };
  55.  
  56. // values:返回一个包含集合中所有数据的数组
  57. this.values = function(){
  58. let values = [];
  59. for(let i=0, keys = Object.keys(items); i<keys.length; i++){
  60. values.push(items[keys[i]]);
  61. }
  62. return values;
  63. };
  64.  
  65. // valuesLegacy:跨浏览器兼容
  66. this.valuesLegacy = function(){
  67. let values = [];
  68. for(let key in items){
  69. if(items.hasOwnPrototype(key)){
  70. values.push(items[key]);
  71. }
  72. }
  73. return values;
  74. };
  75.  
  76. // getItems
  77. this.getItems = function(){
  78. return items;
  79. };
  80.  
  81. // union:并集
  82. this.union = function(otherSet){
  83. let unionSet = new Set();
  84.  
  85. let values = this.values();
  86. for(let i=0; i<values.length; i++){
  87. unionSet.add(values[i]);
  88. }
  89.  
  90. values = otherSet.values();
  91. for(let i=0; i<values.length; i++){
  92. unionSet.add(values[i]);
  93. }
  94. return unionSet;
  95. };
  96.  
  97. // intersection:交集
  98. this.intersection = function(otherSet){
  99. let intersectionSet = new Set();
  100.  
  101. let values = this.values();
  102. for(let i=0; i<values.length; i++){
  103. if(otherSet.has(values[i])){
  104. intersectionSet.add(values[i]);
  105. }
  106. }
  107. return intersectionSet;
  108. };
  109.  
  110. //difference:差集
  111. this.difference = function(otherSet){
  112. let differenceSet = new Set();
  113. let values = this.values();
  114. for(let i=0; i<values.length; i++){
  115. if(!otherSet.has(values[i])){
  116. differenceSet.add(values[i]);
  117. }
  118. }
  119. return differenceSet;
  120. };
  121.  
  122. // subset:子集
  123. this.subset = function(otherSet){
  124. if(this.size() > otherSet.size()){
  125. return false;
  126. }
  127. else{
  128. let values = this.values();
  129. for(let i=0; i<values.length; i++){
  130. if(!otherSet.has(values[i])){
  131. return false;
  132. }
  133. }
  134. }
  135. return true;
  136. }
  137.  
  138. }
  139.  
  140. // Set的使用
  141. var set1 = new Set();
  142. set1.add(1);
  143. set1.add(2);
  144. set1.add(3);
  145.  
  146. var set2 = new Set();
  147. set2.add(1);
  148. set2.add(2);
  149. set2.add(3);
  150. set2.add(4);
  151. set2.add(5);
  152.  
  153. var set3 = new Set();
  154. set3.add("a");
  155. set3.add("b");
  156. set3.add("c");
  157. set3.add("d");
  158.  
  159. // 打印集合大小
  160. console.log(set1.size()); //3
  161. console.log(set2.size()); //5
  162. console.log(set3.size()); //4
  163.  
  164. //打印集合元素的数组形式
  165. console.log(set1.values()); //[1,2,3]
  166. console.log(set2.values()); //[1,2,3,4,5]
  167. console.log(set3.values()); //["a", "b", "c", "d"]
  168.  
  169. // 求set1和set2的并集
  170. let set12 = set1.union(set2);
  171. console.log(set12.values()); //[1,2,3,4,5]
  172.  
  173. // 求set1和set2的交集
  174. let _set12 = set1.intersection(set2);
  175. console.log(_set12.values()); //[1,2,3]
  176.  
  177. // 求set1和set2的差集
  178. let set2_1 = set2.difference(set1);
  179. console.log(set2_1.values()); //[4,5]
  180.  
  181. // 判断set1是否为set2的子集
  182. console.log(set1.subset(set2)); //true
  183.  
  184. // 判断set3是否为set2的子集
  185. console.log(set3.subset(set2)); //false
  186. </script>
  187. </head>
  188. <body>
  189.  
  190. </body>
  191. </html>

  

【javascript】数据结构-集合的更多相关文章

  1. JavaScript数据结构——集合、字典和散列表

    集合.字典和散列表都可以存储不重复的值. 在集合中,我们感兴趣的是每个值本身,并把它当作主要元素.在字典和散列表中,我们用 [键,值] 的形式来存储数据. 集合(Set 类):[值,值]对,是一组由无 ...

  2. JavaScript数据结构——集合的实现与应用

    与数学中的集合概念类似,集合由一组无序的元素组成,且集合中的每个元素都是唯一存在的.可以回顾一下中学数学中集合的概念,我们这里所要定义的集合也具有空集(即集合的内容为空).交集.并集.差集.子集的特性 ...

  3. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

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

    前面已经学习了数组(列表).栈.队列和链表等顺序数据结构.这一章,我们要学习集合,这是一种不允许值重复的顺序数据结构. 本章可以学习到,如何添加和移除值,如何搜索值是否存在,也可以学习如何进行并集.交 ...

  5. JavaScript数据结构与算法-集合练习

    集合的实现 function Set () { this.dataStore = []; this.add = add; this.remove = remove; this.size = size; ...

  6. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  7. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  8. JavaScript数据结构——链表

    链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的.每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 好处:可以添加或移除任意项,它会按需扩容 ...

  9. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

  10. 学习javascript数据结构(四)——树

    前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...

随机推荐

  1. 树形dp-hdu-3721-Building Roads

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3721 题目意思: 给一颗树,求移动一条边(边权值不变)到另外的位置,还是一棵树.求最小的树的直径. ...

  2. java三方---->html解析jsoup的使用

    jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据.今天我 ...

  3. Kotlin——初级篇(一):最详细的环境搭建

    众所周知,Kotlin出来已经良久了.Kotlin有着众多优势,不管是用于Android开发中,还是Java开发,都能缩减很大的代码量,大大提高了工作效率.而小生本人也是才从忙碌的个工作中抽身出来,有 ...

  4. Eclipse failed to get the required ADT version number from the sdk

    failed to get the required ADT version number from the sdk 解决方法: eclipse 和 android studio 工具不能同时共用同一 ...

  5. SenchaTouch 的一些问题记录

    1 : textfield 的 focus事件在手机上会被触发很多次,原因不明,在pc上测试无问题

  6. install kubernetes dashboard 安装 kubernetes dashboard 详细

    参考: http://www.bubuko.com/infodetail-2242562.html http://www.cnblogs.com/zhenyuyaodidiao/p/6500897.h ...

  7. Linux Netfilter注册钩子点

    注册钩子点首先要包含响应的头文件,因为这应该已经属于对kernel的编程了. #include <linux/module.h> #include <linux/kernel.h&g ...

  8. oracle通过profile限制用户的恶意登录和使用期限

    用户profile口令管理 1,可以把profile想象成一个数据对象(文件,规则) 案例: 允许某用户,最多尝试登录3次,如3次未登录成功,则锁定该用户,锁定后两天不能登录系统 设置语法(syste ...

  9. webrtc--stun-turn

    .WebRTC后台服务: 通话的房间服务器(Room Server) 房间服务器是用来创建和管理通话会话的状态维护,是双方通话还是多方通话,加入与离开房间等等,我们暂时沿用Google部署在GAE平台 ...

  10. Intellij idea的Dependencies波浪线

    昨天在家做项目不知道搞了什么出现了大量波浪线.搞了大半天解决了下面的问题. 1.pom.xml出现波浪线.看右边 maven project-->Profiles 勾选dev 2.上面已勾选还有 ...