文档章节

js简单模仿HashMap

代码诱惑
 代码诱惑
发布于 2014/10/08 22:59
字数 447
阅读 29
收藏 0

看了不少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很多方法没实现,还需要补充。。。。待续


© 著作权归作者所有

上一篇: js自定义事件
下一篇: swift闭包初见
代码诱惑
粉丝 1
博文 5
码字总数 3223
作品 0
济南
程序员
私信 提问
以 JavaScript 判定 Web App 太慢是否合理?

此文由Adobe Web Platform团队的工程师Vincent Hardy发表于Adobe博客上。Adobe Web Platform 团队在为 Web 标准 (CSS、FX Task force、SVG)、开源项目 (WebKit、 Chromium Embedded Framewor...

oschina
2013/08/09
3.4K
10
初次用prototype的形式编写JS代码

模仿写一个listbox的功能, 这里只完成部分的功能. 因为完整的应该是与服务端交互, 根据搜索的关键进行匹配. 然后可以利用键盘 或者 鼠标来选择推荐出来的内容. 这里只实现选择的功能. 只要是...

陈袁at互联
2014/07/10
245
0
谈谈javascript中的多线程

不存在的,javascript中根本不存在多线程...... 先不要慌,没有多线程我们可以模仿多线程呀!定时器、web workder等等。 存在即合理,为啥javascript需要多线程? javascript对于现如今的web...

伯涵Style
2018/09/19
0
0
深入理解 JavaScript 中的 class

在 ES6 规范中,引入了 的概念。使得 JS 开发者终于告别了,直接使用原型对象模仿面向对象中的类和类继承时代。 但是JS 中并没有一个真正的 原始类型, 仅仅只是对原型对象运用语法糖。所以,...

穿越过来的键盘手
2018/07/10
0
0
Java_脚本引擎_01_用法入门

一、前言 最近有个需求,需要在js中调用java,这样能避免更新java,从而实现代码的热更新。 于是想到用 Nashorn JavaScript 引擎。 二、概述 通过 JDK 8 的 Nashorn JavaScript 引擎 ,可以很...

shirayner
2018/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
5
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
7
0
JS其他类型值转化为Boolean类型规则

本文转载于:专业的前端网站➤JS其他类型值转化为Boolean类型规则 由于最近在笔试的时候,发现好多关于其他类型转化为Boolean类型的题目,因此总结一下! 一、String类型转化为Boolean 1.转化...

前端老手
昨天
7
0
EurekaClient自动装配及启动流程解析

在上篇文章中,我们简单介绍了EurekaServer自动装配及启动流程解析,本篇文章则继续研究EurekaClient的相关代码 老规矩,先看spring.factories文件,其中引入了一个配置类EurekaDiscoveryClie...

Java学习录
昨天
11
0
析构函数是否必须为虚函数?为何?

p517 在C++中,基类指针可以指向一个派生类的对象。如果基类的析构函数不是虚函数,当需要delete这个指向派生类的基类指针时,就只会调用基类的析构函数,而派生类的析构函数无法被调用。容易...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部