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 相关文章推荐
Javascript中call的两种用法实例
Dec 13 Javascript
JavaScript中如何通过arguments对象实现对象的重载
May 12 Javascript
jQuery实现购物车计算价格功能的方法
Mar 25 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
May 13 Javascript
JS加载iFrame出现空白问题的解决办法
May 13 Javascript
js实现消息滚动效果
Jan 18 Javascript
使用typescript开发angular模块并发布npm包
Apr 19 Javascript
Vue 按键修饰符处理事件的方法
May 04 Javascript
从零开始搭建vue移动端项目到上线的步骤
Oct 15 Javascript
vue 的 solt 子组件过滤过程解析
Sep 07 Javascript
layui输入框中只允许输入整数的实现方法
Sep 18 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接收shell返回的结果中文乱码问题
2014/01/23 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python字典get()方法用法分析
2015/04/17 Python
python中lambda()的用法
2017/11/16 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
Python类的继承super相关原理解析
2020/10/22 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
电信营业员自我评价分享
2014/01/17 职场文书
机房搬迁方案
2014/05/01 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
工作收入住址证明
2014/10/28 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
公证书
2019/04/17 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript