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 相关文章推荐
使用JS 清空File控件的路径值
Jul 08 Javascript
javascript实现切换td中的值
Dec 05 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
使用jQuery给input标签设置默认值
Jun 20 Javascript
jQuery+ajax实现实用的点赞插件代码
Jul 06 Javascript
微信小程序 wx:key详细介绍
Oct 28 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 Javascript
使用InstantClick.js让页面提前加载200ms
Sep 12 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 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 高级课程笔记 面向对象
2009/06/21 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
Python中的闭包总结
2014/09/18 Python
python实现井字棋游戏
2020/03/30 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
python web框架中实现原生分页
2019/09/08 Python
opencv python图像梯度实例详解
2020/02/04 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
教师先进工作者事迹材料
2014/05/01 职场文书
初中学习计划书范文
2014/09/15 职场文书
2015年环保局工作总结
2015/05/22 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers
Redis实现分布式锁的五种方法详解
2022/06/14 Redis