用JavaScript来模拟Java中的Set集合,并实现基础的方法

该代码注释齐全,摘自JavaScript:TDG,个人觉得非常有参考价值,体现了很好的OOP思想,也已经加工后运用在实际项目中。

/**

*运用JavaScript进行模拟Java中的Set无序,无重复集合
**/


//定义构造函数
function Set(){
this.values = {};//用来存在键值对形式的空对象
this.n = 0; //存在计算所存放的值的数量
this.add.apply(this, arguments);//调用add方法,进行数据添加,其定义放在后面
}


//定义添加值的方法
Set.prototype.add = function(){
for (var i = 0; i < arguments.length; i++) {//遍历每个参数
var val = arguments[i];//获取需要添加的值
var str = Set._v2s(val);//按照约定,将值转化为字符串,作为键来使用
if(!this.values.hasOwnProperty(str)){
this.values[str] = val; //不存在这样的值,进行存储
this.n ++;
}
}
return this; //支持函数链操作,这里的this指向Set实例的本身
};


//定义删除值的方法
Set.prototype.remove = function(){
for (var i = 0; i < arguments.length; i++) {//遍历每个参数
var val = arguments[i];//获取需要删除的值
var str = Set._v2s(val);//按照约定,将值转化为字符串,作为键来使用
if(this.values.hasOwnProperty(str)){
delete this.values[str]; //如果存在这样的值,进行删除
this.n --;
}
}
return this; //支持函数链操作,这里的this指向Set实例的本身
};


//定义获取该集合是否包含某个值的方法
Set.prototype.contains = function(value){
return this.values.hasOwnProperty(Set._v2s(value));
};


//定义返回集合尺寸的方法
Set.prototype.size = function(){
return this.n;
};


//定义遍历集合,并在指定的上下文环境中调用函数f, context指定调用的上下文环境
Set.prototype.foreach = function(f, context){
for(var s in this.values){
if(this.values.hasOwnProperty(s)){
f.call(context, this.values[s]);//如果存在这样的值,则在该上下文调用指定方法
}
}
};


//定义将对象转换成唯一字符串标识符的方法
Set._v2s = function(val){
switch(val){ //如果值是某些特殊形式的值,则在存储中只用一条记录进行保存
case undefined : return 'u';
case null : return 'n';
case true : return 't';
case false : return 'f';
default :
switch(typeof val){ //非特殊值
case 'number': return '#' + val; //数字形式
case 'string': return '"' + val; //字符串形式
default : return '@' + objectId(val); //对象形式
}
//定义对值对象进行获取唯一标识符的方法
function objectId(o){
var prop = "|**objectId**|";
if(!o.hasOwnProperty(prop)){
o[prop] = Set._v2s.next ++;
}
return o[prop];
}
}
};
Set._v2s.next = 100;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值