JS中MAP的用法示例,创建,赋值,清空,拷贝等,以及MAP工具类

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>JS中MAP的用法示例</title>
    <script>
        var myMap = new Map();
        myMap.set(0, "zero");
        myMap.set(1, "one");
        console.log('---------------------------------------------------')
        console.log(myMap.get(0)); //returns zero
        console.log(myMap.get("zero")); //returns undefined
        console.log(myMap.size);
        console.log(myMap.has(0));  // returns true
        console.log(myMap.has("zero"));  // returns false
        //console.log(myMap.delete(0));
        //myMap.clear();
        //console.log(myMap.size);

        for (var [key, value] of myMap) {
            console.log(key + " = " + value);
        }
        // 将会显示两个log。一个是"0 = zero"另一个是"1 = one"
        console.log('---------------------------------------------------')
        for (var key of myMap.keys()) {
            console.log(key);
        }
        // 将会显示两个log。 一个是 "0" 另一个是 "1"
        console.log('---------------------------------------------------')
        for (var value of myMap.values()) {
            console.log(value);
        }
        // 将会显示两个log。 一个是 "zero" 另一个是 "one"
        console.log('---------------------------------------------------')
        for (var [key, value] of myMap.entries()) {
            console.log(key + " = " + value);
        }
        // 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"

        console.log('---------------------------------------------------')
        var kvArray = [["key1", "value1"], ["key2", "value2"]];

        // 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
        var myMap = new Map(kvArray);

        myMap.get("key1"); // 返回值为 "value1"

        // 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
        console.log(Array.from(myMap)); // 输出和kvArray相同的数组

        // 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
        console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

        console.log('---------------------------------------------------')
        var original = new Map([
            [0, "zero"],
            [1, 'one'],
            [2, 'two'],
        ]);

        var clone = new Map(original);

        console.log(clone.get(1)); // one
        console.log(clone.get(2)); // one
        console.log(original === clone); // false. Useful for shallow comparison


        var first = new Map([
            [1, 'one'],
            [2, 'two'],
            [3, 'three'],
        ]);

        var second = new Map([
            [1, 'uno'],
            [2, 'dos']
        ]);

        // 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
        // 展开运算符本质上是将Map对象转换成数组。
        var merged = new Map([...first, ...second]);
        for (var [key, value] of merged) {
            console.log(key + " = " + value);
        }
    </script>
</head>
<body>

</body>
</html>
/*
 * MAP对象,实现MAP功能
 *
 * 接口:
 * 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)
 *
 * 例子:
 * var map = new Map();
 *
 * map.put("key", "value");
 * var val = map.get("key")
 * ……
 *
 */
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;
    };
}

 

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