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 相关文章推荐
jquery获取URL中参数解决中文乱码问题的两种方法
Dec 18 Javascript
通过url查找a元素并点击
Apr 09 Javascript
使用AOP改善javascript代码
May 01 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
Jul 27 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
Feb 12 Javascript
AngularJS表格添加序号的方法
Mar 03 Javascript
jQuery弹出窗口简单实现代码
Mar 09 Javascript
关于Vue组件库开发详析
Jul 01 Javascript
vue基于element的区间选择组件
Sep 07 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
Dec 05 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
Jul 22 jQuery
javascript中call,apply,callee,caller用法实例分析
Jul 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
在PHP中使用XML
2006/10/09 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python多线程编程方式分析示例详解
2013/12/06 Python
Python中decorator使用实例
2015/04/14 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
python用for循环求和的方法总结
2019/07/08 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
德国旅游网站:weg.de
2018/06/03 全球购物
花卉与景观设计系大学生求职信
2013/10/01 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
森林病虫害防治方案
2014/06/02 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
学术研讨会主持词
2015/07/04 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript