编码实现js的Set
1 /** 2 * 3 * Set 4 * 5 * @author: 阿宁 6 * 7 * @date: 2017年5月30日 8 * 9 */ 10 (function(global){ 11 12 function Set(){ 13 this.values = {}; 14 this.n = 0; 15 this.add.apply(this,arguments); 16 } 17 18 Set.prototype.add = function(){ 19 for(var i = 0; i < arguments.length; i++){ 20 var val = arguments[i]; 21 var key = Set._v2s(val); 22 if(!this.values.hasOwnProperty(key)){ 23 this.values[key] = val; 24 this.n++; 25 } 26 } 27 return this; 28 }; 29 30 Set.prototype.remove = function(){ 31 for(var i = 0; i < arguments.length; i++){ 32 var key = Set._v2s(arguments[i]); 33 if(this.values.hasOwnProperty(key)){ 34 delete this.values[key]; 35 this.n--; 36 } 37 } 38 return this; 39 }; 40 41 Set.prototype.contain = function(val){ 42 return this.values.hasOwnProperty(Set._v2s(val)); 43 }; 44 45 Set.prototype.foreach = function(f,c){ 46 for(var key in this.values){ 47 if(this.values.hasOwnProperty(key)){ 48 f.call(c,this.values[key]); 49 } 50 } 51 return this; 52 }; 53 54 Set._v2s = function(val){ 55 switch(val){ 56 case undefined:return "u"; 57 case null:return "n"; 58 case true:return "t"; 59 case false: return "f"; 60 default:switch(typeof val){ 61 case "number":return "#" + val; 62 case "string":return """ + val; 63 default : return "@" + objectId(val); 64 } 65 } 66 function objectId(val){ 67 var prop = "|**objectid**|"; 68 if(!val.hasOwnProperty(prop)){ 69 val[prop] = Set._v2s.next++; 70 } 71 return val[prop]; 72 } 73 }; 74 75 Set._v2s.next = 100; 76 77 global.Set = Set; 78 79 })(this);