JavaScript一个集合的运算类

输出都在控制台中:

<script type="text/javascript">
function  Set() {        //这是一个构造函数
    this.values = {};    //集合数据保存在对象的属性里
    this.n      = 0;    //集合中值的个数
    this.add.apply( this, arguments );    //把所有参数都添加到这个集合中
}

//将每个参数都填加到集合中
Set.prototype.add = function(){
    console.log("参数的长度为:"+arguments.length);
    for( var i = 0; i<arguments.length ; i++ ){        //遍历每个参数
        var val = arguments[ i ];                    //待添加到集合中的值
        //console.log(val);
        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 str = Set._v2s(arguments[i]);            //将字符串和值对应起来
        if(this.values.hasOwnProperty(str)){        //如果它存在集合中
            delete this.values[str];                //删除它
            this.n--;                                //集合中值的计数减一
        }
    }
    return this;
};

//如果集合中包含这个值,则返回true;否则返回false
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
    }
};

//这个一个内部函数,用以将任意js值和唯一的字符串对应起来
Set._v2s = function(val){
    //console.log(typeof 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); //objs and funcs get @
        }
    }

    //对任意对象来说,都会返回一个字符串
    //正对不同的对象,这个函数会返回不同字符串
    //对于同一个对象的多次调用,总是返回相同的字符串
    //为了做到这一点,它给o创建了一个属性,在ES5中,这个属性是不可枚举且是只读的
    function objectId(o){
        var prop = "|**objectid|";                    //私有属性,用以存放id
        if(!o.hasOwnProperty(prop))                    //如果队形没有id
            o[prop] = Set._v2s.next++;                 //将下一个值赋给它
        return o[prop];                                //返回这个id
    }
};

Set._v2s.next = 100;         //设置初始id的值

//实例测试:
var s = new Set(1,2,4,4,"aaaaa",5,6,{a:1,b:3},6,7);
console.log(s.values);
console.log(s.size());

</script>

 

posted @ 2017-05-28 00:54  newAdmin  阅读(575)  评论(0编辑  收藏  举报