集合类
它是一种数据类型,用以表示非重复值的无序集合。
它的基础方法包括添加值,检测值是否在集合中,这种集合需要一个通用的实现,以保证操作效率。以下实例实现了从javascript值到唯一字符串的映射,然后将这个字符串用做属性。
对象和函数都不具备如此简明可靠的唯一字符串表示。因此集合中的每一个对象或函数都要定义一个唯一的属性标识。
function Set(){
this.values = {}; //集合对象保存在对象的属性里
this.n = 0; //集合中对象的个数
this.prototype.add.apply(this,arguments);
}
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)){//集合的值集中没这个key则添加key及key对应的值
this.values[str] = val;
this.n++
}
}
return this; //支持链式方法调用
}
Set.prototype.remove = function(){
var val = arguments[i];
var str = Set._v2s(val); //将参数转换为字符串
if(this.values.hasOwnProperty(str)==true){ //集合的值集中没这个key则添加key及key对应的值
delete this.values[str];
this.n--;
}
}
return this; //支持链式方法调用
}
Set.prototype.contains = function(value){
return this.values.hasOwnProperty(Set._v2s(value));
}
Set.prototype.size = function(){
return this.n;
}
//遍历集合中的所有元素,在指定的上下文中调用f
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); //obj和func
}
}
//object 时返回的
//不同对象返回不同字符串,同一对象总是返回相同字符
function objectId(o){
var prop = "|**objectid**|";
if(!o.hasOwnProperty(prop)){
o[prop] = Set._v2s.next++;
}
return o[prop]; //返回这个id
}
}
Set._v2s.next=100; //设置id从100开始