`

javascript 实现java中的Map (高效)[转]

阅读更多

javascript实现java中的Map,代码是在国外的一个网站上看到的(http://stackoverflow.com/questions/368280/javascript-hashmap-equivalent ),自己稍作了修改,之前也看到过有人用2个数组实现了Map,但是我感觉效率比较低,现在这个我感觉效率还可以,自己做了下测试,代码如下:
Map.js

Java代码 复制代码
  1. function Map(linkItems) {    
  2.      this .current = undefined;    
  3.      this ._size =  0 ;    
  4.      if (linkItems ===  false ){   
  5.          this .disableLinking();    
  6.     }    
  7. }   
  8. /**  
  9.  * 获取当前map  
  10.  * @return 当前对象  
  11.  */   
  12. Map.noop = function() {    
  13.      return   this ;    
  14. };    
  15. /**  
  16.  * 非法操作  
  17.  * @return  
  18.  */   
  19. Map.illegal = function() {    
  20.      throw   new  Error( "非法操作,Map已经被禁用" );    
  21. };    
  22. /**  
  23.  *   
  24.  * @param obj  
  25.  * @param foreignKeys  
  26.  * @return  
  27.  */   
  28. Map.from = function(obj, foreignKeys) {    
  29.     var map =  new  Map;    
  30.      for (var prop in obj) {    
  31.          if (foreignKeys || obj.hasOwnProperty(prop)){   
  32.             map.put(prop, obj[prop]);    
  33.         }    
  34.     }    
  35.      return  map;    
  36. };    
  37. /**  
  38.  * 禁用map  
  39.  * @return  
  40.  */   
  41. Map.prototype.disableLinking = function() {    
  42.      this .link = Map.noop;    
  43.      this .unlink = Map.noop;    
  44.      this .disableLinking = Map.noop;    
  45.      this .next = Map.illegal;    
  46.      this .key = Map.illegal;    
  47.      this .value = Map.illegal;    
  48.      this .clear = Map.illegal;    
  49.      return   this ;    
  50. };    
  51. /**  
  52.  * 返回hash值 例如:number 123  
  53.  * @param value key/value  
  54.  * @return  
  55.  */   
  56. Map.prototype.hash = function(value) {    
  57.      return  (typeof value) +  ' '  + (value  instanceof  Object ? (value.__hash || (value.__hash = ++arguments.callee.current)) : value.toString());    
  58. };    
  59. /**  
  60.  * 返回map的长度  
  61.  * @return  
  62.  */   
  63. Map.prototype.size = function() {    
  64.      return   this ._size;   
  65. };    
  66.   
  67. Map.prototype.hash.current =  0 ;    
  68. /**  
  69.  * 通过key获取value  
  70.  * @param key  
  71.  * @return  
  72.  */   
  73. Map.prototype.get = function(key) {    
  74.     var item =  this [ this .hash(key)];    
  75.      return  item === undefined ? undefined : item.value;    
  76. };    
  77. /**  
  78.  * 向map中添加数据  
  79.  * @param key 键  
  80.  * @param value 值  
  81.  * @return  
  82.  */   
  83. Map.prototype.put = function(key, value) {    
  84.     var hash =  this .hash(key);    
  85.      if ( this [hash] === undefined) {    
  86.         var item = { key : key, value : value };    
  87.          this [hash] = item;    
  88.          this .link(item);    
  89.         ++ this ._size;    
  90.     } else {   
  91.          this [hash].value = value;   
  92.     }    
  93.      return   this ;    
  94. };    
  95. /**  
  96.  * 通过key删除数据  
  97.  * @param key  
  98.  * @return  
  99.  */   
  100. Map.prototype.remove = function(key) {    
  101.     var hash =  this .hash(key);    
  102.     var item =  this [hash];    
  103.      if (item !== undefined) {    
  104.         -- this ._size;    
  105.          this .unlink(item);    
  106.         delete  this [hash];    
  107.     }    
  108.      return   this ;    
  109. };    
  110. /**  
  111.  * 清除map  
  112.  * @return  
  113.  */   
  114. Map.prototype.clear = function() {    
  115.      while ( this ._size){   
  116.          this .remove( this .key());    
  117.     }    
  118.      return   this ;    
  119. };    
  120. /**  
  121.  * 处理队列  
  122.  * @param item  
  123.  * @return  
  124.  */   
  125. Map.prototype.link = function(item) {    
  126.      if ( this ._size ==  0 ) {    
  127.         item.prev = item;    
  128.         item.next = item;    
  129.          this .current = item;    
  130.     } else  {    
  131.         item.prev =  this .current.prev;    
  132.         item.prev.next = item;    
  133.         item.next =  this .current;    
  134.          this .current.prev = item;   
  135.     }    
  136. };    
  137. Map.prototype.unlink = function(item) {    
  138.      if ( this ._size ==  0 ){    
  139.          this .current = undefined;   
  140.     } else  {    
  141.         item.prev.next = item.next;    
  142.         item.next.prev = item.prev;    
  143.          if (item ===  this .current){   
  144.              this .current = item.next;    
  145.         }    
  146.     }    
  147. };    
  148. /**  
  149.  * 获取下一个  
  150.  * @return  
  151.  */   
  152. Map.prototype.next = function() {    
  153.      this .current =  this .current.next;    
  154.      return   this ;   
  155. };    
  156. /**  
  157.  * 获取key  
  158.  * @return  
  159.  */   
  160. Map.prototype.key = function() {    
  161.      return   this .current.key;    
  162. };    
  163. /**  
  164.  * 获取value  
  165.  * @return  
  166.  */   
  167. Map.prototype.value = function() {    
  168.      return   this .current.value;    
  169. };   
function Map(linkItems) { 
    this.current = undefined; 
    this._size = 0; 
    if(linkItems === false){
    	this.disableLinking(); 
    } 
}
/**
 * 获取当前map
 * @return 当前对象
 */
Map.noop = function() { 
    return this; 
}; 
/**
 * 非法操作
 * @return
 */
Map.illegal = function() { 
    throw new Error("非法操作,Map已经被禁用"); 
}; 
/**
 * 
 * @param obj
 * @param foreignKeys
 * @return
 */
Map.from = function(obj, foreignKeys) { 
    var map = new Map; 
    for(var prop in obj) { 
        if(foreignKeys || obj.hasOwnProperty(prop)){
        	map.put(prop, obj[prop]); 
        } 
    } 
    return map; 
}; 
/**
 * 禁用map
 * @return
 */
Map.prototype.disableLinking = function() { 
    this.link = Map.noop; 
    this.unlink = Map.noop; 
    this.disableLinking = Map.noop; 
    this.next = Map.illegal; 
    this.key = Map.illegal; 
    this.value = Map.illegal; 
    this.clear = Map.illegal; 
    return this; 
}; 
/**
 * 返回hash值 例如:number 123
 * @param value key/value
 * @return
 */
Map.prototype.hash = function(value) { 
    return (typeof value) + ' ' + (value instanceof Object ? (value.__hash || (value.__hash = ++arguments.callee.current)) : value.toString()); 
}; 
/**
 * 返回map的长度
 * @return
 */
Map.prototype.size = function() { 
    return this._size;
}; 

Map.prototype.hash.current = 0; 
/**
 * 通过key获取value
 * @param key
 * @return
 */
Map.prototype.get = function(key) { 
    var item = this[this.hash(key)]; 
    return item === undefined ? undefined : item.value; 
}; 
/**
 * 向map中添加数据
 * @param key 键
 * @param value 值
 * @return
 */
Map.prototype.put = function(key, value) { 
    var hash = this.hash(key); 
    if(this[hash] === undefined) { 
        var item = { key : key, value : value }; 
        this[hash] = item; 
        this.link(item); 
        ++this._size; 
    }else{
    	this[hash].value = value;
    } 
    return this; 
}; 
/**
 * 通过key删除数据
 * @param key
 * @return
 */
Map.prototype.remove = function(key) { 
    var hash = this.hash(key); 
    var item = this[hash]; 
    if(item !== undefined) { 
        --this._size; 
        this.unlink(item); 
        delete this[hash]; 
    } 
    return this; 
}; 
/**
 * 清除map
 * @return
 */
Map.prototype.clear = function() { 
    while(this._size){
		this.remove(this.key()); 
	} 
    return this; 
}; 
/**
 * 处理队列
 * @param item
 * @return
 */
Map.prototype.link = function(item) { 
    if(this._size == 0) { 
        item.prev = item; 
        item.next = item; 
        this.current = item; 
    }else { 
        item.prev = this.current.prev; 
        item.prev.next = item; 
        item.next = this.current; 
        this.current.prev = item;
    } 
}; 
Map.prototype.unlink = function(item) { 
    if(this._size == 0){ 
        this.current = undefined;
    }else { 
        item.prev.next = item.next; 
        item.next.prev = item.prev; 
        if(item === this.current){
        	this.current = item.next; 
        } 
    } 
}; 
/**
 * 获取下一个
 * @return
 */
Map.prototype.next = function() { 
    this.current = this.current.next; 
    return this;
}; 
/**
 * 获取key
 * @return
 */
Map.prototype.key = function() { 
    return this.current.key; 
}; 
/**
 * 获取value
 * @return
 */
Map.prototype.value = function() { 
    return this.current.value; 
}; 


测试代码如下:

Java代码 复制代码
  1. var l= 10000 ;   
  2.     var map= new  Map();   
  3.     var start= new  Date().getTime();   
  4.      for (var i= 0 ;i<l;i++){   
  5.         map.put( "key_" +i, new  Date());   
  6.     }   
  7.     var end= new  Date().getTime();   
  8.     document.write( "向map中添加了  " +l+ " 个Date对象.........." );   
  9.     document.write( "<br/>" );   
  10.     document.write( "耗时  " +(end-start)+ " 毫秒,map的长度为:" +map.size());   
  11.     document.write( "<br/>" );   
  12.     document.write( "在map中提取全部数据.........." );   
  13.     document.write( "<br/>" );   
  14.     start= new  Date().getTime();   
  15.      for (var i= 0 ;i<map.size();i++){   
  16.         map.get( "key_" +i).getTime();   
  17.     }   
  18.     end= new  Date().getTime();   
  19.     document.write( "耗时  " +(end-start)+ " 毫秒" );   
  20.     document.write( "<br/>" );   
  21.     document.write( "清空map.........." );   
  22.     document.write( "<br/>" );   
  23.     start= new  Date().getTime();   
  24.     map.clear();   
  25.     end= new  Date().getTime();   
  26.     document.write( "耗时  " +(end-start)+ " 毫秒,map的长度为:" +map.size());   
  27.     document.write( "<br/>" );  
var l=10000;
	var map=new Map();
	var start=new Date().getTime();
	for(var i=0;i<l;i++){
		map.put("key_"+i,new Date());
	}
	var end=new Date().getTime();
	document.write("向map中添加了  "+l+" 个Date对象..........");
	document.write("<br/>");
	document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());
	document.write("<br/>");
	document.write("在map中提取全部数据..........");
	document.write("<br/>");
	start=new Date().getTime();
	for(var i=0;i<map.size();i++){
		map.get("key_"+i).getTime();
	}
	end=new Date().getTime();
	document.write("耗时  "+(end-start)+" 毫秒");
	document.write("<br/>");
	document.write("清空map..........");
	document.write("<br/>");
	start=new Date().getTime();
	map.clear();
	end=new Date().getTime();
	document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());
	document.write("<br/>");


测试结果如下:
1.IE7



2.Firefox 3.6.8



3.谷歌浏览器5.0



方法next的使用:

Java代码 复制代码
  1. var map= new  Map();   
  2.     map.put( "key_1" , "value_1" );   
  3.     map.put( "key_2" , "value_2" );   
  4.     map.put( "key_3" , "value_3" );   
  5.     var m=map.next();   
  6.     document.write( "map.next:key=" +m.key()+ " value=" +m.value());   
  7.     document.write( "<br/>" );   
  8.     m=map.next();   
  9.     document.write( "map.next:key=" +m.key()+ " value=" +m.value());  
var map=new Map();
	map.put("key_1","value_1");
	map.put("key_2","value_2");
	map.put("key_3","value_3");
	var m=map.next();
	document.write("map.next:key="+m.key()+" value="+m.value());
	document.write("<br/>");
	m=map.next();
	document.write("map.next:key="+m.key()+" value="+m.value());


结果如下:

Java代码 复制代码
  1. map.next:key=key_2 value=value_2   
  2. map.next:key=key_3 value=value_3  
分享到:
评论

相关推荐

    不用第三方jar的json与object(map、list)互换java类

    在Java编程中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。本文将深入探讨如何在不依赖第三方库的情况下,实现JSON与Java对象(如Map、List)之间的互换。我们将分析...

    Java Map 遍历比较齐全的解析.docx

    在某些场景下,如果需要兼容JavaScript或者使用类似的方法,可能会使用`Object.keys(map).length`,但这是JavaScript中的写法,在Java中并不适用。 3. **Java 8及Lambda表达式遍历Map** 自Java 8开始,引入了...

    json和map互转的标准化实现

    在编程领域,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于服务器与客户端之间的...通过理解和应用这些知识,开发者可以有效地在Java项目中实现JSON与Map的互换,并保证数据的标准化表示。

    ajax和json跟java实现List、Map直接传递

    在Web开发中,Ajax(Asynchronous JavaScript and XML)和JSON(JavaScript Object Notation)是两种常用的技术,用于实现页面的异步数据交互和数据传输。Java作为后端服务器语言,常与它们配合处理数据,尤其是当...

    使用json-lib实现json与Java对象的互转

    通过以上步骤,我们可以利用 `json-lib` 实现 JSON 与 Java 对象的高效互转。这个库不仅提供了基本的转换功能,还支持自定义转换规则和处理复杂的数据结构,是 Java 开发中的实用工具。在实际开发中,根据具体需求...

    js仿java的map对象

    总结来说,为了在JavaScript中实现类似于Java Map的功能,我们可以选择自定义对象或使用ES6的Map数据结构。自定义对象简单易懂,适用于不涉及复杂操作的情况;而ES6的Map则提供了更为强大和标准的API,适用于大型...

    Java代码实现Map和Object互转及Map和Json互转

    总结一下,Map和Object互转以及Map和JSON互转是Java Web开发中常见的需求。前者可以通过反射、Apache Commons BeanUtils或者Introspector类来实现,而后者则可以使用专门的JSON处理库如Gson、Jackson或Fastjson。...

    基于JavaScript和Java的电影院管理系统设计源码 - MyMovie

    本源码提供了一个基于JavaScript和Java的电影院管理系统的设计。项目包含2138个文件,其中包括954个JavaScript...该项目旨在为电影院提供高效的管理服务,通过JavaScript和Java技术实现,以提升用户体验和操作便捷性。

    js中模仿java的map使用

    根据提供的文件信息,本文将详细解释如何在JavaScript中模拟Java中的`Map`功能,并实现一组基本的操作方法。这种做法有助于理解两种语言之间处理键值对数据结构的不同方式,并且能够帮助开发者利用JavaScript来构建...

    基于JavaScript、Java、CSS的Java_web豪车租车信息管理系统设计源码

    本系统是一款基于JavaScript、Java和CSS的Java_web豪车租车信息管理系统源码,总计包含334个文件,其中包括176个JavaScript文件、80个Java文件、33个JSP文件、16个CSS文件、11个JPG文件、5个PNG文件、4个MAP文件、1...

    java 数据分页显示

    以上就是Java中实现数据分页显示的关键点,涉及数据库查询、参数传递、前端渲染等多个环节。实践中,我们需要结合具体的应用场景和性能需求,选择合适的方法和工具来实现高效、友好的分页功能。

    java-任何类型转换成json数据格式

    在现代Web开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java应用中,经常会遇到需要将Java对象或集合等数据结构转换为JSON字符串的需求...

    Java1.8API中文手册

    Java 8引入了Nashorn JavaScript引擎,允许Java程序直接执行JavaScript代码,实现Java和JavaScript之间的互操作。 十、Type注解 Java 1.8允许在类型上使用注解,增强了编译时和运行时的类型检查,如@NonNull用于...

    REST_JavaMap_Req_java_JSON_

    在这个特定的场景中,"REST_JavaMap_Req_java_JSON_" 提示我们讨论的是如何在Java中使用Map对象作为REST请求的数据模型,并通过JSON(JavaScript Object Notation)进行序列化和反序列化。JSON是一种轻量级的数据...

    基于JavaScript和Java的学生宿舍管理系统设计源码

    本项目是基于JavaScript和Java的学生宿舍管理系统设计源码,包含320个文件,其中包括200个JavaScript文件、35个Java源文件、23个CSS样式文件、14个LESS样式文件、14个SCSS样式文件、11个MAP文件、4个HTML文件、2个...

    Java基本数据转换成Json代码

    Java中的JSON转换是开发过程中常见的任务,特别是在与服务器进行数据交互时。JSON(JavaScript Object ...通过使用适当的库和理解转换机制,你可以轻松地在Java对象和JSON格式之间进行转换,实现高效的数据交换。

    java转换xml、list、map和json.pdf

    在Java开发中,数据交换和存储经常涉及XML、JSON以及List和Map之间的转换。XML(eXtensible Markup Language)是一种用于标记数据的格式,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,两者...

    java编写的简单的单位换算工具

    下面将详细介绍这款工具的实现原理、功能以及相关的Java编程知识点。 1. **Java基础** Java是一种跨平台的编程语言,具有“一次编写,到处运行”的特性。它的面向对象特性使得开发像单位换算工具这样的应用变得...

    dwr练习实例(各种数据转换list,map,数组等)

    Direct Web Remoting (DWR) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,实现Ajax应用。这个"dwR练习实例(各种数据转换list,map,数组等)"是一个用于学习DWR如何处理和转换不同...

    json和map互转jackson和json-lib两种方式实现和区别

    在Java中,我们经常需要将JSON字符串与Map对象互相转换,以便处理数据。本篇文章将详细探讨使用Jackson库和json-lib库这两种流行的方式进行转换,并分析它们之间的差异。 **一、Jackson库** Jackson是Java开发的高...

Global site tag (gtag.js) - Google Analytics