使用JS模擬出Map對象

最近要做的一個項目,支持方提供的一個Map方法,用着相當可以,功能稍有欠缺,因此我爲之做了擴展,以下是代碼:

function Map() {
    this.elements = new Array();

    //獲取MAP元素個數
    this.size = function() {
        return this.elements.length;
    };

    //判斷MAP是否爲空
    this.isEmpty = function() {
        return (this.elements.length < 1);
    };

    //刪除MAP所有元素
    this.clear = function() {
        this.elements = new Array();
    };

    //向MAP中增加元素(key, value) 
    this.put = function(_key, _value) {
        this.elements.push( {
            key : _key,
            value : _value
        });
    };

    //刪除指定KEY的元素,成功返回True,失敗返回False
    this.removeByKey = function(_key) {
        var bln = false;
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].key == _key) {
                    this.elements.splice(i, 1);
                    return true;
                }
            }
        } catch (e) {
            bln = false;
        }
        return bln;
    };
    
    //刪除指定VALUE的元素,成功返回True,失敗返回False
    this.removeByValue = function(_value) {//removeByValueAndKey
        var bln = false;
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].value == _value) {
                    this.elements.splice(i, 1);
                    return true;
                }
            }
        } catch (e) {
            bln = false;
        }
        return bln;
    };
    
    //刪除指定VALUE的元素,成功返回True,失敗返回False
    this.removeByValueAndKey = function(_key,_value) {
        var bln = false;
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].value == _value && this.elements[i].key == _key) {
                    this.elements.splice(i, 1);
                    return true;
                }
            }
        } catch (e) {
            bln = false;
        }
        return bln;
    };

    //獲取指定KEY的元素值VALUE,失敗返回NULL
    this.get = function(_key) {
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].key == _key) {
                    return this.elements[i].value;
                }
            }
        } catch (e) {
            return false;
        }
        return false;
    };

    //獲取指定索引的元素(使用element.key,element.value獲取KEY和VALUE),失敗返回NULL
    this.element = function(_index) {
        if (_index < 0 || _index >= this.elements.length) {
            return null;
        }
        return this.elements[_index];
    };

    //判斷MAP中是否含有指定KEY的元素
    this.containsKey = function(_key) {
        var bln = false;
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].key == _key) {
                    bln = true;
                }
            }
        } catch (e) {
            bln = false;
        }
        return bln;
    };

    //判斷MAP中是否含有指定VALUE的元素
    this.containsValue = function(_value) {
        var bln = false;
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].value == _value) {
                    bln = true;
                }
            }
        } catch (e) {
            bln = false;
        }
        return bln;
    };
    
    //判斷MAP中是否含有指定VALUE的元素
    this.containsObj = function(_key,_value) {
        var bln = false;
        try {
            for (i = 0; i < this.elements.length; i++) {
                if (this.elements[i].value == _value && this.elements[i].key == _key) {
                    bln = true;
                }
            }
        } catch (e) {
            bln = false;
        }
        return bln;
    };

    //獲取MAP中所有VALUE的數組(ARRAY)
    this.values = function() {
        var arr = new Array();
        for (i = 0; i < this.elements.length; i++) {
            arr.push(this.elements[i].value);
        }
        return arr;
    };
    
    //獲取MAP中所有VALUE的數組(ARRAY)
    this.valuesByKey = function(_key) {
        var arr = new Array();
        for (i = 0; i < this.elements.length; i++) {
            if (this.elements[i].key == _key) {
                arr.push(this.elements[i].value);
            }
        }
        return arr;
    };

    //獲取MAP中所有KEY的數組(ARRAY)
    this.keys = function() {
        var arr = new Array();
        for (i = 0; i < this.elements.length; i++) {
            arr.push(this.elements[i].key);
        }
        return arr;
    };
    
    //獲取key通過value
    this.keysByValue = function(_value) {
        var arr = new Array();
        for (i = 0; i < this.elements.length; i++) {
            if(_value == this.elements[i].value){
                arr.push(this.elements[i].key);
            }
        }
        return arr;
    };
    
    //獲取MAP中所有KEY的數組(ARRAY)
    this.keysRemoveDuplicate = function() {
        var arr = new Array();
        for (i = 0; i < this.elements.length; i++) {
            var flag = true;
            for(var j=0;j<arr.length;j++){
                if(arr[j] == this.elements[i].key){
                    flag = false;
                    break;
                } 
            }
            if(flag){
                arr.push(this.elements[i].key);
            }
        }
        return arr;
    };
}

已經具備的功能:

/* size()     獲取MAP元素個數
 * isEmpty()    判斷MAP是否爲空
 * clear()     刪除MAP所有元素
 * put(key, value)   向MAP中增加元素(key, value) 
 * remove(key)    刪除指定KEY的元素,成功返回True,失敗返回False
 * get(key)    獲取指定KEY的元素值VALUE,失敗返回NULL
 * element(index)   獲取指定索引的元素(使用element.key,element.value獲取KEY和VALUE),失敗返回NULL
 * containsKey(key)  判斷MAP中是否含有指定KEY的元素
 * containsValue(value) 判斷MAP中是否含有指定VALUE的元素
 * values()    獲取MAP中所有VALUE的數組(ARRAY)
 * keys()     獲取MAP中所有KEY的數組(ARRAY)

*/

相對於java的Map來說,這個JS的Map功能或許尚有不足,尤其是put方法,居然不能夠自動排重,也就是如果key存在重複,就一直存在着,也就說key有可能不唯一,不會進行value的覆蓋,這顯然與我們所認識的Map有所區別,爲此,做一個擴展:

var myMap = {
	getMapInstance:function(){
		var map = new Map();
		/**
		 * 如果key已存在,覆蓋value
		 */
		map.putNoRepeat = function(_key,_value){
			if(this.containsKey(_key)){
				for (i = 0; i < this.elements.length; i++) {
					 if (this.elements[i].key == _key) {
						 this.elements[i].value = _value;
						 break;
			         }
		        }
			}else{
				this.put(_key, _value);
			}
		}
		return map;
	}	
		
};
這樣的話,即繼承了上面的Map,有了putNoRepeat這樣的排重方法,使用的時候只需要:

var map = myMap.getMapInstance();
這樣既能使用擴展的方法,又能節省不必要內存開銷。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章