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 eval函数深入认识
Feb 21 Javascript
理解Javascript_08_函数对象
Oct 15 Javascript
js中用window.open()打开多个窗口的name问题
Mar 13 Javascript
JavaScript中的继承方式详解
Feb 11 Javascript
js实现点击图片改变页面背景图的方法
Feb 28 Javascript
跟我学习javascript的循环
Nov 18 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
Kotlin学习第一步 kotlin语法特性
May 25 Javascript
javascript实现延时显示提示框效果
Jun 01 Javascript
node.js 用socket实现聊天的示例代码
Oct 17 Javascript
微信小程序获取音频时长与实时获取播放进度问题
Aug 28 Javascript
JavaScript canvas仿代码流瀑布
Feb 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采用session实现防止页面重复刷新
2015/12/24 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
JavaScript实现tab栏切换效果
2020/03/16 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
详解python 发送邮件实例代码
2016/12/22 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
python实现梯度法 python最速下降法
2020/03/24 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
离婚协议书标准格式
2014/10/04 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS