js 面向对像实现 Set 集合

function Set(){
    this.values = {};  // 集合数据保存在对像的属性里
    this.n = 0;         // 集合中值的个数
    this.add.apply(this, arguments); // 把所有参数(数组: [1,2,3])都添加到这个集合, 参数本来就是数组形式
}

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;        //支持链式方法调用
}

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;    
}
// 如果集合中包含这个值, 则返回true
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]);   // 调用f , 传入value
}

// 这是一个内部函数, 用以将任意的 JavaScript 值 和唯一的字符串对应起来
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; 

 

posted @ 2014-12-06 22:51  hewep  阅读(640)  评论(0编辑  收藏  举报