使用JS類比出Map對象

來源:互聯網
上載者:User

使用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
已經具備的功能:

/* 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來說,功能或許尚有不足,尤其是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();
這樣既能使用擴充的方法,又能節省不必要記憶體開銷。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.