js简单模仿HashMap

本文介绍了一个简单的JavaScript实现的HashMap对象,该对象模仿了Java中的HashMap,并支持泛型约束。通过闭包模式定义,确保了内部数据的安全性。文章提供了完整的源代码及示例。

看了不少ECMAScript,心血来潮写了个简单的模仿JAVA中HashMap的js对象,对泛型简单的实现

//用闭包模式把对象定义到Window上,避免属性名称的值被篡改
(function(win){
    var HashMap = function(keyType,valueType){
        this.length = 0 ;
        this._keys = [];
        this._values = [];
        this.size = function(){
            return this.length;
        };
        this.put = function(key,value){
            if(!keyType && !valueType){  //对没有定义存储类型的Map
                   for(var i in this._keys){
                        if(this._keys[i] == key){
                            this._values[i] = value;
                            return;
                        }
                    }
                    this._keys.push(key);
                    this._values.push(value);
                    this.length++;
            }else{  //定义了类型的 new HashMap("string",Object);
                if(typeof(key) == keyType && (value instanceof valueType)){
                    for(var i in this._keys){
                        if(this._keys[i] == key){
                            this._values[i] = value;
                            return;
                        }
                    }
                    this._keys.push(key);
                    this._values.push(value);
                    this.length++;
                }else{
                    alert("对象类型不符合");
                }
            }
        };
        this.get = function(key){
             for(var i in this._keys){
                  if(this._keys[i] == key){
                      return this._values[i];
                 }
              }
              return null;
        };
        
        this.remove = function(key){
             for(var i in this._keys){
                  if(this._keys[i] == key){
                      var temp = this._values[i];
                      //删除key  
                      this._keys = this._keys.slice(0,i).concat(this._keys.slice(++i));
                      //删除key对应的value
                      this._values = this._keys.slice(0,--i).concat(this._keys.slice(++i));
                 
                      this.length--;
                      return temp;
                 }
              }
              return null;
        };
        
        this.isEmpty = function(){
            return this.length == 0;
        };
        
        this.clear = function(){
            this.length = 0;
            this._keys = [];
            this._values = [];
        };
        this.putAllMap = function(map){
            if(map instanceof HashMap){
                this._keys.concat(map._keys);
                this._values.concat(map._values);
                this.length += map.length;
            }else{
                 throw new Error("不为HashMap对象")
            }
        };
        
        this.containsKey = function(key){
            for(var i in this._keys){
                if(this._keys[i] == key){
                    return true;
                }
            }
            return false;
        };
        
        this.keysClone  = function(){
            var keys = [];
            for(var i in this._keys){
                keys.push(this._keys[i]);
            }
            return keys;
        };
        this.toString = function(){ //此方法要求存储对象实现了toString()方法
            var data = "{";
            for(var i in this._keys){
                data += this._keys[i] +":" + this._values[i].toString() +","; 
            }
            data = data.substring(0,data.length-1)+"}";
            return data;
        }
    }
    win.HashMap = HashMap;
})(window);

function Dog(name){
    this.name = name;
    this.toString = function(){
        return this.name;
    }
}

//使用

var map = new HashMap('string',Dog); //此map只存放  key为stirng类型,value是用new Dog("")生产的对象
map.put("杰克",new Dog("杰克"));
map.put("汤姆",new Dog("汤姆"));
map.put("大神",new Dog("大神"));
map.put("小仙",new Dog("小仙"));

alert(map.remove("大神").toString());

java中Map很多方法没实现,还需要补充。。。。待续


转载于:https://my.oschina.net/u/1450816/blog/325094

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值