JavaScript 自己封裝的Set

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);

“`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章