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添加String.Format方法
Aug 11 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
基于jquery的时间段实现代码
Aug 02 Javascript
javascript数组快速打乱重排的方法
Jan 02 Javascript
JavaScript中的函数嵌套使用
Jun 04 Javascript
浅谈javascript中return语句
Jul 15 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
JavaScript制作弹出层效果
Dec 02 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 Javascript
Vue实现动态查询规则生成组件
May 27 Vue.js
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出错界面
2006/10/09 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JS跨域总结
2012/08/30 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
重构Python代码的六个实例
2020/11/25 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
J2EE包括哪些技术
2016/11/25 面试题
硕士研究生个人求职信
2013/12/04 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
2015年测量员工作总结
2015/05/23 职场文书
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang