分享

javascript 实现java中的Map (高效)

 CevenCheng 2012-05-24
javascript实现java中的Map,代码是在国外的一个网站上看到的(http:///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. };   

测试代码如下: 
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/>");  

测试结果如下: 
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());  

结果如下: 
Java代码  收藏代码
  1. map.next:key=key_2 value=value_2  
  2. map.next:key=key_3 value=value_3   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多