JavaScript数据结构——模仿ES6中定义的类似的Set类

  1 function Set(){
  2     var items={};
  3
  4     this.has=function(value){
  5         return items.hasOwnProperty(value);
  6     };
  7
  8     this.add=function(value){
  9         if(!this.has(value)){
 10             items[value]=value;
 11             return true;
 12         }
 13         return false;
 14     };
 15
 16     this.remove=function(value){
 17         if(this.has(value)){
 18             delete items[value];
 19             return true;
 20         }
 21         return false;
 22     };
 23
 24     this.clear=function(){
 25         items={};
 26     };
 27
 28     //方法一:ES5以上
 29 /*    this.size=function(){
 30         return Object.keys(items).length;
 31     }*/
 32
 33     //方法二:兼容新较强
 34     //hasOwnProperty()用于排除items原型自身的属性
 35     this.size=function(){
 36         var count=0;
 37         for(var prop in items){
 38             if(items.hasOwnProperty(prop)){
 39                 count++;
 40             }
 41         }
 42         return count;
 43     };
 44
 45     //方法一:ES5以上
 46     /*this.values=function(){
 47         return Object.keys(items);
 48     };*/
 49
 50     //兼容性比较强
 51     this.values=function(){
 52         var keys=[];
 53         for(var key in items){
 54             if(items.hasOwnProperty(key)){
 55                 keys.push(key);
 56             }
 57         }
 58         return keys;
 59     };
 60
 61
 62     //集合的并操作
 63     this.union=function(otherSet){
 64         var unionSet = new Set();
 65         var values=this.values();
 66         for(var i=0;i<values.length;i++){
 67             unionSet.add(values[i]);
 68         }
 69
 70         values=otherSet.values();
 71         for(i;i<values.length;i++){
 72             unionSet.add(values[i]);
 73         }
 74         return unionSet;
 75     };
 76
 77     //集合的交集
 78     this.intersection=function(otherSet){
 79         var intersectionSet = new Set();
 80         var values=this.values();
 81         for(var i=0;i<values.length;i++){
 82             if(otherSet.has(values[i])){
 83                 intersectionSet.add(values[i]);
 84             }
 85         }
 86         return intersectionSet;
 87     };
 88
 89     //差集操作
 90     this.difference=function(otherSet){
 91         var differenceSet = new Set();
 92         var values=this.values();
 93         for(var i=0;i<values.length;i++){
 94             if(!otherSet.has(values[i])){
 95                 differenceSet.add(values[i]);
 96             }
 97         }
 98         return differenceSet;
 99     };
100
101     //判断是否是otherSet的子集
102     this.subSet=function(otherSet){
103         if(this.size()>otherSet.size()){
104             return false;
105         }else{
106             var values=this.values();
107             for(var i=0;i<values.length;i++){
108                 if(!otherSet.has(values[i])){
109                     return false;
110                 }
111             }
112             return true;
113         }
114
115     }

这个实现中,比较需要注意的是,set类即是数学概念上的集合,集合中的元素不得重复,具有唯一性。所以用对象初始化items,可以利用键值对的唯一性特点实现集合的性质。相关的集合性质可以查看数学集合概念知识。上述例子可以自行编写一些简单的html例子实现。

时间: 2024-12-28 11:53:41

JavaScript数据结构——模仿ES6中定义的类似的Set类的相关文章

JavaScript学习12 JS中定义对象的几种方式

JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript"> var object = new Object(); object.name

JavaScript学习12 JS中定义对象的几种方式【转】

avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript

javascript在私有作用域中定义私有变量和私有函数 (1)

javascript没有私有成员,但是有私有变量,所有对戏那个属性都是公有的 任何在函数中定义的变量,都可以认为是私有变量,因为函数内部不能访问. 私有变量包括:函数的参数.局部变量.函数内部定义的其他函数 - 在私有作用域中定义私有变量和私有函数 function MyObject(){ //私有变量和私有函数 var privateVariable=10; function privateFunction(params) { return false } //特权方法----有权访问私有变量

C++中定义一个不能被继承的类

1.一种错误的解法 最开始是从构造函数开始着手(先声明这种方法不能定义一个不能被继承的类,这是一种错误的方法,但是很容易往这方面想),假设存在下面的继承体系: 现在假设B是一个不能被继承的类,那么如果存在B的子类C,那么C的构造过程应该会报错,那么如何能够让B能正常构造而C不能正常构造呢?首先A,B,C的构造函数和析构函数都假设是public的,最开始想的是让B私有继承自A,根据private继承的特性,父类中public和protected的成员在子类中都会变成private的,那么A的构造函

【Javascript】: for循环中定义的变量在for循环体外也有效

for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = 111; console.log(i); } alert("carl is:"+carl); })(); </script> 结果: carl is:111

JavaScript数据结构 持续更新中。。一周后可完结

array: 数组创建: var troop=new Array(6); //创建一个长度为6的数组 var troop=new Array(2,3,5,6,4,7); 数组方法: var str="I love javascript"; var single=str.split(""); //'I',' ','l','o',..... var mutipy=str.split(" "); //'I','love','javascript' va

并发数据结构 : .NET Framework 中提供的读写锁 ReaderWriterLockSlim 类

转自;http://www.cnblogs.com/lucifer1982/archive/2008/12/07/1349437.html ReaderWriterLockSlim 类 新的 ReaderWriterLockSlim 类支持三种锁定模式:Read,Write,UpgradeableRead.这三种模式对应的方法分别是 EnterReadLock,EnterWriteLock,EnterUpgradeableReadLock .再就是与此对应的 TryEnterReadLock,T

最新的JavaScript核心语言标准&mdash;&mdash;ES6,彻底改变你编写JS代码的方式!【转载+整理】

原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructuring 箭头函数 Arrow Functions Symbols 集合 学习Babel和Broccoli,马上就用ES6 代理 Proxies ES6 说自己的宗旨是"凡是新加入的特性,势必已在其它语言中得到强有力的实用性证明."--TRUE!如果你大概浏览下 ES6 的新特性,事实上它

(六)javascriptJS中定义对象的几种方式(转)

JavaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascrip