jsMap带遍历功能

7/6/2011 10:35:47 PM

用js写了一个Map,带遍历功能,请大家点评下啦。

//map.js

s代码  
  1. Array.prototype.remove = function(s) {   
  2.     for (var i = 0; i < this.length; i++) {   
  3.         if (s == this[i])   
  4.             this.splice(i, 1);   
  5.     }   
  6. }   
  7.   
  8. /**
  9.  * Simple Map  
  10.  *   
  11.  *   
  12.  * var m = new Map();  
  13.  * m.put('key','value');  
  14.  * ...  
  15.  * var s = "";  
  16.  * m.each(function(key,value,index){  
  17.  *      s += index+":"+ key+"="+value+"\n";  
  18.  * });  
  19.  * alert(s);  
  20.  *   
  21.  * @author dewitt  
  22.  * @date 2008-05-24  
  23.  */  
  24. function Map() {   
  25.     /** 存放键的数组(遍历用到) */  
  26.     this.keys = new Array();   
  27.     /** 存放数据 */  
  28.     this.data = new Object();   
  29.        
  30.     /**
  31.      * 放入一个键值对  
  32.      * @param {String} key  
  33.      * @param {Object} value  
  34.      */  
  35.     this.put = function(key, value) {   
  36.         if(this.data[key] == null){   
  37.             this.keys.push(key);   
  38.         }   
  39.         this.data[key] = value;   
  40.     };   
  41.        
  42.     /**
  43.      * 获取某键对应的值  
  44.      * @param {String} key  
  45.      * @return {Object} value  
  46.      */  
  47.     this.get = function(key) {   
  48.         return this.data[key];   
  49.     };   
  50.        
  51.     /**
  52.      * 删除一个键值对  
  53.      * @param {String} key  
  54.      */  
  55.     this.remove = function(key) {   
  56.         this.keys.remove(key);   
  57.         this.data[key] = null;   
  58.     };   
  59.        
  60.     /**
  61.      * 遍历Map,执行处理函数  
  62.      *   
  63.      * @param {Function} 回调函数 function(key,value,index){..}  
  64.      */  
  65.     this.each = function(fn){   
  66.         if(typeof fn != 'function'){   
  67.             return;   
  68.         }   
  69.         var len = this.keys.length;   
  70.         for(var i=0;i<len;i++){   
  71.             var k = this.keys[i];   
  72.             fn(k,this.data[k],i);   
  73.         }   
  74.     };   
  75.        
  76.     /**
  77.      * 获取键值数组(类似Java的entrySet())  
  78.      * @return 键值对象{key,value}的数组  
  79.      */  
  80.     this.entrys = function() {   
  81.         var len = this.keys.length;   
  82.         var entrys = new Array(len);   
  83.         for (var i = 0; i < len; i++) {   
  84.             entrys[i] = {   
  85.                 key : this.keys[i],   
  86.                 value : this.data[i]   
  87.             };   
  88.         }   
  89.         return entrys;   
  90.     };   
  91.        
  92.     /**
  93.      * 判断Map是否为空  
  94.      */  
  95.     this.isEmpty = function() {   
  96.         return this.keys.length == 0;   
  97.     };   
  98.        
  99.     /**
  100.      * 获取键值对数量  
  101.      */  
  102.     this.size = function(){   
  103.         return this.keys.length;   
  104.     };   
  105.        
  106.     /**
  107.      * 重写toString   
  108.      */  
  109.     this.toString = function(){   
  110.         var s = "{";   
  111.         for(var i=0;i<this.keys.length;i++,s+=','){   
  112.             var k = this.keys[i];   
  113.             s += k+"="+this.data[k];   
  114.         }   
  115.         s+="}";   
  116.         return s;   
  117.     };   
  118. }   
  119.   
  120.   
  121. function testMap(){   
  122.     var m = new Map();   
  123.     m.put('key1','Comtop');   
  124.     m.put('key2','南方电网');   
  125.     m.put('key3','景新花园');   
  126.     alert("init:"+m);   
  127.        
  128.     m.put('key1','康拓普');   
  129.     alert("set key1:"+m);   
  130.        
  131.     m.remove("key2");   
  132.     alert("remove key2: "+m);   
  133.        
  134.     var s ="";   
  135.     m.each(function(key,value,index){   
  136.         s += index+":"+ key+"="+value+"\n";   
  137.     });   
  138.     alert(s);   
  139. }  

 //testMap.htm

Html代码  
  1. <html>  
  2. <head>  
  3. <title>Test Map</title>  
  4. <script language="javascript" src="map.js">  
  5. </script>  
  6. </head>  
  7. <body>  
  8. <input type="button" value="test" onclick="testMap()">  
  9. </body>  
  10.  </html>