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 常用函数库详解
Oct 21 Javascript
js操作ajax返回的json的注意问题!
Feb 23 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
Apr 16 Javascript
在Windows上安装Node.js模块的方法
Sep 25 Javascript
jquery事件的ready()方法使用详解
Nov 11 Javascript
js实现兼容IE、Firefox的图片缩放代码
Dec 08 Javascript
jquery trigger函数执行两次的解决方法
Feb 29 Javascript
js实现图片缓慢放大缩小效果
Aug 02 Javascript
JS排序之选择排序详解
Apr 08 Javascript
js自定义弹框插件的封装
Aug 24 Javascript
原生js实现获取form表单数据代码实例
Mar 27 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 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文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
wordpress之wp-settings.php
2007/08/17 PHP
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
jquery文字上下滚动的实现方法
2013/03/22 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
express启用https使用小记
2019/05/21 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python根据多个文件名批量查找文件
2019/08/13 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
资料员的岗位职责
2013/11/20 职场文书
一夜的工作教学反思
2014/02/08 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python