zoukankan      html  css  js  c++  java
  • 使用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();
    
    这样既能使用扩展的方法,又能节省不必要内存开销。


  • 相关阅读:
    Kotlin开发 扩展函数在Android开发中的一些实用例子
    Kotlin开发 使用lambda实现接口回调
    Android开发 Camera2的CaptureRequest属性整理--完善中
    Android开发 Bitmap图像处理详解
    Android开发 Camera预览画面镜像问题
    Android开发 ViewPage2
    windows 服务器更新程序下载-修复漏洞
    JAVA实现数据等分,一个List分成多个List
    List<CourseRecord>转HashMap<Long, List<CourseRecord>>
    模拟服务器1.0——WebServer 、ClientHandler 接收请求、做出响应
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4264722.html
Copyright © 2011-2022 走看看