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常用运算符(Operators)-javascript基础教程
Dec 14 Javascript
firefox下frameset取不到值的解决方法
Sep 06 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
Jan 23 Javascript
上传的js验证(图片/文件的扩展名)
Apr 25 Javascript
把jQuery的类、插件封装成seajs的模块的方法
Mar 12 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
禁用backspace网页回退功能的实现代码
Nov 15 Javascript
基于JavaScript实现类名的添加与移除
Apr 23 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
Nov 28 Javascript
聊聊JS动画库 Velocity.js的使用
Mar 13 Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 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
第三节 定义一个类 [3]
2006/10/09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
php中动态调用函数的方法
2015/03/16 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
python求绝对值的三种方法小结
2019/12/04 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
如何利用python读取micaps文件详解
2020/10/18 Python
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
应届毕业生自我评价分享
2013/12/15 职场文书
自荐书4要点
2014/01/25 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
遗失说明具结保证书
2015/02/26 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL