function Set() { this.values = {};//集合数据保存对象的属性值 this.length = 0; //集合中值的个数 this.add.apply(this, arguments);//把所有的参数添加到集合 }; //集合中添加元素 Set.PRototype.add = function () { for (var i = 0, len = arguments.length; i < len; i++) { var val = arguments[i]; var str = Set._valToStr(val);//转换为字符串 if (!this.values.hasOwnProperty(str)) { //如果不在集合中,将字符串和值对应起来,集合中的长度+1 this.values[str] = val; this.length++; } } }; //获取值 Set.prototype.get = function (index) { if (isNaN(parseFloat(index)) || !isFinite(index) || index >= this.length) return undefined; for (var s in this.values) { //集合中所有的字符串 if (this.values.hasOwnProperty(s)) { if (index == 0) return this.values[s]; index–; } } return this;//支持链式调用 }; //集合中删除元素 Set.prototype.remove = function () { for (var i = 0, len = arguments.length ; i < len; i++) { var str = Set._valToStr(arguments[i]); if (this.values.hasOwnProperty(str)) { delete this.values[str]; this.length–; } } return this;//返回this为了支持链式调用 }; //是否包含某个值 Set.prototype.contains = function (value) { return this.values.hasOwnProperty(Set._valToStr(value)); }; //返回集合的长度 Set.prototype.size = function () { return this.length; }; //在指定的上下文遍历集合中的所有元素 Set.prototype.foreach = function (f, context) { for (var s in this.values) { //集合中所有的字符串 if (this.values.hasOwnProperty(s)) { //去掉继承而来的属性 f.call(context, this.values[s]); } } }; //比较两个Set是否相等 Set.prototype.equals = function (that) { if (this == that) return true; //如果that 对象不是一个集合,它和this不相等,使用instanceof 使这个方法可以应用于Set的任何子类 //注意null和undefined两个值是无法用于instanceof 运算的 if (!(that instanceof Set)) return false; if (this.size() != that.size()) return false; try { this.foreach(function (v) { if (!(that.contains(v))) throw false; }); } catch (e) { if (e === false) return false; throw e; } }; //私有函数(通常使用_开始),用来将任意js的值和字符串对应 Set._valToStr = function (value) { switch (value) { case undefined: return “undefined”; case null: return “null”; case true: return “true”; case false: return “false”; default: switch (typeof value) { case “number”: //数字带有number前缀 return “number” + value; case “string”://字符串带有string前缀 return “string” + value; default: return “@” + objectId(value); } } //对任意对象,都返回一个字符串,针对不同的对象,此函数返回不同的字符串,对于同一个对象多次调用,总是返回相同的字符串 //为了做到这一点,给对象o创建一个属性,在ES5中这个属性不可枚举且是只读的 function objectId(o) { var prop = “|objectid|”;//私有属性,存放id if (!o.hasOwnProperty(prop)) { o[prop] = Set._valToStr.next++; } return o[prop]; }; }; Set._valToStr.next = 0;//初始化id的值
使用如下: var set = new Set(); set.add(true); set.add(false); set.add(true); set.add(false); set.add(1); set.add(null); console.log(set.size()); console.log(); console.log(set.get(5)); console.log(); for (var i = 0; i < set.size(); i++) { console.log(set.get(i)); } console.log(); set.foreach(console.log,document);“`
新闻热点
疑难解答