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 高亮显示文本中重要的关键字
Dec 24 Javascript
javascript操作excel生成报表示例
May 08 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 Javascript
Node.js中使用socket创建私聊和公聊聊天室
Nov 19 Javascript
JSON键值对序列化和反序列化解析
Jan 24 Javascript
jQuery实现获取隐藏div高度的方法示例
Feb 09 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
在vue项目中引用Iview的方法
Sep 14 Javascript
在vue项目中引入highcharts图表的方法
Jan 21 Javascript
vue实现简单图片上传
Jun 30 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 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
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
php读取excel文件的简单实例
2013/08/26 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
window.onload使用指南
2015/09/13 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
python实现从web抓取文档的方法
2014/09/26 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
国贸专业个人求职信分享
2013/12/04 职场文书
青春寄语大全
2014/04/09 职场文书
护士工作失误检讨书
2014/09/14 职场文书
2015年清明节活动总结
2015/02/09 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
成人成长感言如何写?
2019/08/16 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
浅谈克隆 JavaScript
2021/11/02 Javascript
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL