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有关的小细节
Apr 02 Javascript
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
Jan 29 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
Node.js下自定义错误类型详解
Oct 17 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
Jun 19 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
在layui中layer弹出层点击事件无效的解决方法
Sep 05 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
暑假社会实践心得体会
2014/09/02 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
员工聘用合同范本
2015/09/21 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python
JavaScript 原型与原型链详情
2021/11/02 Javascript