JavaScript 自己封装的Set

来源:互联网 发布:abbyy12序列号mac 编辑:程序博客网 时间:2024/05/14 22:03

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

“`

1 0
原创粉丝点击