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);“`
新聞熱點
疑難解答