JavaScript中利用Array和Object实现Map的方法


Posted in Javascript onJuly 27, 2015

本文实例讲述了JavaScript中利用Array和Object实现Map的方法。分享给大家供大家参考。具体如下:

昨天突然看到以前别人用JavaScript实现的Map感觉很不错,但是发现有个别方法有问题,顺便完善了下,添加了 remove 、indexOf 、values、clear等方法。

/**
 * @author blune68
 * @version 0.1, 07/27/12
 * 
 */
function Map(){
  this.keys = new Array(); 
  this.data = new Object();
  var toString = Object.prototype.toString;
  /**
   * 当前Map当前长度
   */
  this.size = function(){
    return this.keys.length;
  }
  /**
   * 添加值
   * @param {Object} key
   * @param {Object} value
   */
  this.put = function(key, value){
    if(this.data[key] == null){
      this.data[key] = value;
    }
    this.keys.push(key);
  }
  /**
   * 根据当前key获取value
   * @param {Object} key
   */
  this.get = function(key){
    return this.data[key];
  }
  /**
   * 根据当前key移除Map对应值
   * @param {Object} key
   */
  this.remove = function(key){
    var index = this.indexOf(key);
    if(index != -1){
      this.keys.splice(index, 1);
    }
    this.data[key] = null;
  }
  /**
   * 清空Map
   */
  this.clear = function(){
    for(var i=0, len = this.size(); i < len; i++){
      var key = this.keys[i];
      this.data[key] = null;
    }
    this.keys.length = 0;
  }
  /**
   * 当前key是否存在
   * @param {Object} key
   */
  this.containsKey = function(key){
    return this.data[key] != null;
  }
  /**
   * 是否为空
   */
  this.isEmpty = function(){
    return this.keys.length === 0;
  }
  /**
   * 类型Java中Map.entrySet
   */
  this.entrySet = function(){
    var size = this.size();
    var datas = new Array(size);
    for (var i = 0, len = size; i < len; i++) {
      var key = this.keys[i];
      var value = this.data[key];
      datas[i] = {
        'key' : key,
        'value':value  
      }
    }
    return datas;
  }
  /**
   * 遍历当前Map
   * var map = new Map();
   * map.put('key', 'value');
   * map.each(function(index, key, value){
   *   console.log("index:" + index + "--key:" + key + "--value:" + value)
   * })
   * @param {Object} fn
   */
  this.each = function(fn){
    if(toString.call(fn) === '[object Function]'){
      for (var i = 0, len = this.size(); i < len; i++) {
        var key = this.keys[i];
        fn(i, key, this.data[key]);
      }
    }
    return null;
  }
  /**
   * 获取Map中 当前key 索引值
   * @param {Object} key
   */
  this.indexOf = function(key){
    var size = this.size();
    if(size > 0){
      for(var i=0, len=size; i < len; i++){
        if(this.keys[i] == key)
        return i;
      }
    }
    return -1;
  }
  /**
   * Override toString
   */
  this.toString = function(){
    var str = "{";
    for (var i = 0, len = this.size(); i < len; i++, str+=",") {
      var key = this.keys[i];
      var value = this.data[key];
      str += key + "=" + value; 
    }
    str = str.substring(0, str.length-1);
    str += "}";
    return str;
  }
  /**
   * 获取Map中的所有value值(Array)
   */
  this.values = function(){
    var size = this.size();
    var values = new Array();
    for(var i = 0; i < size; i++){
      var key = this.keys[i];
      values.push(this.data[key]);
    }
    return values;
  }
}

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
jquery实现checkbox全选全不选的简单实例
Dec 31 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
jquerymobile局部渲染的各种刷新方法小结
Mar 05 Javascript
JQuery中使用on方法绑定hover事件实例
Dec 09 Javascript
Linux下编译安装php libevent扩展实例
Feb 14 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
Mar 03 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
ES6字符串的扩展实例
Dec 21 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 #Javascript
javascript简单实现滑动菜单效果的方法
Jul 27 #Javascript
JavaScript判断IE版本型号
Jul 27 #Javascript
javascript通过获取html标签属性class实现多选项卡的方法
Jul 27 #Javascript
readonly和disabled属性的区别
Jul 26 #Javascript
javascript实现继承的简单实例
Jul 26 #Javascript
IE10中flexigrid无法显示数据的解决方法
Jul 26 #Javascript
You might like
php遍历数组的4种方法总结
2014/07/05 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
使用pip安装python库的多种方式
2019/07/31 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
python如何实时获取tcpdump输出
2020/09/16 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
工程力学硕士生的自我评价范文
2013/11/16 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
首席执行官观后感
2015/06/03 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
总结高并发下Nginx性能如何优化
2021/11/01 Servers