JAVA & XML & JAVASCRIPT & AJAX & CSS

Web 2.0 技术储备............

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  77 随笔 :: 17 文章 :: 116 评论 :: 0 Trackbacks

 

  1 <script language="javascript">
  2 /**
  3 *作者 :Fantasy
  4 *Email: fantasycs@163.com
  5 *QQ   : 8635335
  6 *Blog : http://www.blogjava.net/fantasy
  7 *版本 :V1.1 
  8 */
  9 function HashMap()
 10 {
 11     /** Map 大小 **/
 12     var size = 0;
 13     /** 对象 **/
 14     var entry = new Object();
 15     
 16     /** 存 **/
 17     this.put = function (key , value)
 18     {
 19         if(!this.containsKey(key))
 20         {
 21             size ++ ;
 22         }
 23         entry[key] = value;
 24     }
 25     
 26     /** 取 **/
 27     this.get = function (key)
 28     {
 29         return this.containsKey(key) ? entry[key] : null;
 30     }
 31     
 32     /** 删除 **/
 33     this.remove = function ( key )
 34     {
 35         ifthis.containsKey(key) && ( delete entry[key] ) )
 36         {
 37             size --;
 38         }
 39     }
 40     
 41     /** 是否包含 Key **/
 42     this.containsKey = function ( key )
 43     {
 44         return (key in entry);
 45     }
 46     
 47     /** 是否包含 Value **/
 48     this.containsValue = function ( value )
 49     {
 50         for(var prop in entry)
 51         {
 52             if(entry[prop] == value)
 53             {
 54                 return true;
 55             }
 56         }
 57         return false;
 58     }
 59     
 60     /** 所有 Value **/
 61     this.values = function ()
 62     {
 63         var values = new Array();
 64         for(var prop in entry)
 65         {
 66             values.push(entry[prop]);
 67         }
 68         return values;
 69     }
 70     
 71     /** 所有 Key **/
 72     this.keys = function ()
 73     {
 74         var keys = new Array();
 75         for(var prop in entry)
 76         {
 77             keys.push(prop);
 78         }
 79         return keys;
 80     }
 81     
 82     /** Map Size **/
 83     this.size = function ()
 84     {
 85         return size;
 86     }
 87     
 88     /* 清空 */
 89     this.clear = function ()
 90     {
 91         size = 0;
 92         entry = new Object();
 93     }
 94 }
 95 
 96 var map = new HashMap();
 97 
 98 /*
 99 map.put("A","1");
100 map.put("B","2");
101 map.put("A","5");
102 map.put("C","3");
103 map.put("A","4");
104 */
105 
106 /*
107 alert(map.containsKey("XX"));
108 alert(map.size());
109 alert(map.get("A"));
110 alert(map.get("XX"));
111 map.remove("A");
112 alert(map.size());
113 alert(map.get("A"));
114 */
115 
116 /** 同时也可以把对象作为 Key **/
117 /*
118 var arrayKey = new Array("1","2","3","4");
119 var arrayValue = new Array("A","B","C","D");
120 map.put(arrayKey,arrayValue);
121 var value = map.get(arrayKey);
122 for(var i = 0 ; i < value.length ; i++)
123 {
124     //alert(value[i]);
125 }
126 */
127 /** 把对象做为Key时 ,自动调用了该对象的 toString() 方法 其实最终还是以String对象为Key**/
128 
129 /** 如果是自定义对象 那自己得重写 toString() 方法 否则 . 就是下面的结果 **/
130 
131 function MyObject(name)
132 {
133     this.name = name;
134 }
135 
136 /**
137 function MyObject(name)
138 {
139     this.name = name;
140     
141     this.toString = function ()
142     {
143         return this.name;
144     }
145 }
146 **/
147 var object1 = new MyObject("小张");
148 var object2 = new MyObject("小名");
149 
150 map.put(object1,"小张");
151 map.put(object2,"小名");
152 alert(map.get(object1));
153 alert(map.get(object2));
154 map.remove("xxxxx");
155 alert(map.size());
156 
157 /** 运行结果 小名 小名 size = 1 **/
158 
159 /** 如果改成复写toString()方法的对象 , 效果就完全不一样了 **/
160 
161 </script>
posted on 2006-05-06 14:52 Web 2.0 技术资源 阅读(6655) 评论(22)  编辑  收藏 所属分类: Javascript

评论

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性] 2006-05-06 16:39 123
up!  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性] 2006-05-08 15:01 dennis
很棒!  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性] 2006-05-08 23:53 Web 2.0 技术资源
@dennis

谢谢支持!

这个是在我上次写的HashMap上完全改进的~~~

谢谢 bbs.51js.com 上的朋友提出宝贵的意见。
  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2006-05-27 09:16
顶个
写的不错  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2006-08-02 17:22 java player
谢谢主人。加油。  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2006-08-14 13:43 谭立平
楼主的实现思路挺不错,我在blog中把它改成了prototype版本的hashtable,其中修正了一个小bug ,就是删除集合中对象的时候,如果对象不存在,那么size仍然会减1 ,整体说还是一个不错的实现思路,呵呵,值得参考  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2006-08-15 10:48 Web 2.0 技术资源
@谭立平

谢谢 楼上的兄弟提出的BUG ~ 不过我自己测还没测出这个问题......

再次去参考了文档 :
/***********************************************/
delete 运算符
从对象中删除一个属性,或从数组中删除一个元素。
delete expression
expression 参数是一个有效的 JScript 表达式,通常是一个属性名或数组元素。
说明
如果 expression 的结果是一个对象,且在 expression 中指定的属性存在,而该对象又不允许它被删除,则返回 false。
在所有其他情况下,返回 true。
/***********************************************/
在删除元素的时候增加了~ this.containsKey(key) 的条件限制。
增加了 clear 方法。
  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2006-10-15 12:03 悠扬---靖宝华
郁闷,对类和对象,昨天我理解错了,今天好像是理解对了  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2006-10-22 12:08 Web 2.0 技术资源
修正了一个严重的BUG .

情况1
var array = new Array();
array.push("A"); array.length = 1

情况2 (想当然的为初始化长度,以为那样效率可以高那么一点点........)
var array = new Array( 3 );
array.push("A"); array.length = 4

区别大呢............. 不像JAVA里面....

他爷爷的~~!


  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-01-09 12:55 js
做个东西先要有实用的地方, Array自己可以带名称索引,可变长度,JS变量也是可变的.

var hashTable = [];
添加元数
hashTable["A"] = "a";
hashTable["B"] = object;
得到元数
var value = haseTable["A"];
var value = haseTable["B"];

所以说包含你的所有功能``没有一点意义
splice()就是你的remove()只是功能比你强点
lenght就是你的size
put(),get()直接通过索引隐式调用[""]
另外比你多这些方法concat,join ,pop ,push,reverse,shift,slice,sort,toLocaleString  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-01-09 15:21 Web 2.0 技术资源
@js

设计这个Map 主要是为了填补 Javascript 中没有Map工具的不足。

你觉得你用Array 来代替 Map 那样你写的Javascript 会清晰明了吗?

那在Java里面何必需要HashSet, 直接用HashMap也能实现~

关键是让自己编码更清晰.... 数据类型更明了。  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-04-24 14:33 ...
这个具有缓存功能吗?  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-04-24 14:36 fantasy
@...

具有缓存能力啊!
只是看你怎么去实现了....... 你自己把握缓存的生命周期。  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现][未登录] 2008-05-22 13:29 bobo
支持火狐吗?  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-05-23 09:41 fantasy
支持FireFox  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-07-02 11:40 traveller
@js
这位仁兄,说别人不对的时候请先肯定自己是对的,不然很丢人现眼耶
hashTable["A"] = "a";
hashTable["B"] = object;
这是Object就能提供的使用方法,而不是Array。用这种方式不会改变Array的长度,就是说你的length始终是0,"a"和object根本没有放进Array内部的集合中,因此也是无法遍历的。
splice()和remove()在这没有任何意义
那么,你搞清楚了楼主到底要解决什么问题了吗?  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-11-04 09:38 liz
顶,写的不错  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2008-12-04 17:25 clue
不小心路过...

最近正好也自己写了一个,你的实现还是会有些问题
如果有框架自定义了
Object.prototype
当你for(var p in entry)时,会把自定义的prototype里的内容也取出来
所以,最好定义一个PERFIX前缀来判断是否是自己存的值
-----------------------------
function MyMap(){}
MyMap.prototype = {
_length : 0,
_DEF_PERFIX : 'MY_MAP_KEY_',
size : function(){return this._length},
get : function(key){
return this[this._DEF_PERFIX+key];
},
put : function(key,value){
if(!this[this._DEF_PERFIX+key]){
this._length++;
}
this[this._DEF_PERFIX+key] = value;
return value;
},
remove : function(key){
if(this._length>0 && this[this._DEF_PERFIX+key]){
delete this[this._DEF_PERFIX+key];
this._length--;
return true;
}
return false;
},
getKeySet : function(){
var retArr = [];
for(var key in this){
if(key.length>this._DEF_PERFIX.length && key.indexOf(this._DEF_PERFIX)==0){
retArr.push(key.substr(this._DEF_PERFIX.length));
}
}
return retArr;
}
}
  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2009-01-06 17:42 Web 2.0 技术资源
谢谢楼上的兄弟! 对头................. 的确存在那样的问题。
没考虑周全。  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2009-12-16 10:52 shouldbai
这个在IE6里面测试过吗?每次调用put方法都会报错,entry is undefined  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2010-03-23 11:41 多福多寿
好像都没有一点哈希算法在里面 怎么算得上hashmap呢  回复  更多评论
  

# re: [原创] Javascript 封装 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代码实现] 2010-05-05 11:25 tmp
这不是 HashMap 鉴定完毕。只是对 Object 封装一下,用处不大。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问