原贴地址,封装的很不错,很OO,呵呵,跟写java的习惯一样.
1 <script language="javascript">
2 function HashMap()
3 {
4 /** Map 大小 **/
5 var size = 0;
6 /** 对象 **/
7 var entry = new Object();
8
9 /** 存 **/
10 this.put = function (key , value)
11 {
12 if(!this.containsKey(key))
13 {
14 size ++ ;
15 }
16 entry[key] = value;
17 }
18
19 /** 取 **/
20 this.get = function (key)
21 {
22 if( this.containsKey(key) )
23 {
24 return entry[key];
25 }
26 else
27 {
28 return null;
29 }
30 }
31
32 /** 删除 **/
33 this.remove = function ( key )
34 {
35 if( 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(size);
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(size);
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 var map = new HashMap();
90
91 /*
92 map.put("A","1");
93 map.put("B","2");
94 map.put("A","5");
95 map.put("C","3");
96 map.put("A","4");
97 */
98
99 /*
100 alert(map.containsKey("XX"));
101 alert(map.size());
102 alert(map.get("A"));
103 alert(map.get("XX"));
104 map.remove("A");
105 alert(map.size());
106 alert(map.get("A"));
107 */
108
109 /** 同时也可以把对象作为 Key **/
110 /*
111 var arrayKey = new Array("1","2","3","4");
112 var arrayValue = new Array("A","B","C","D");
113 map.put(arrayKey,arrayValue);
114 var value = map.get(arrayKey);
115 for(var i = 0 ; i < value.length ; i++)
116 {
117 //alert(value[i]);
118 }
119 */
120 /** 把对象做为Key时 ,自动调用了该对象的 toString() 方法 其实最终还是以String对象为Key**/
121
122 /** 如果是自定义对象 那自己得重写 toString() 方法 否则 . 就是下面的结果 **/
123
124 function MyObject(name)
125 {
126 this.name = name;
127 }
128
129 /**
130 function MyObject(name)
131 {
132 this.name = name;
133
134 this.toString = function ()
135 {
136 return this.name;
137 }
138 }
139 **/
140 var object1 = new MyObject("小张");
141 var object2 = new MyObject("小名");
142
143 map.put(object1,"小张");
144 map.put(object2,"小名");
145 alert(map.get(object1));
146 alert(map.get(object2));
147 alert(map.size());
148
149 /** 运行结果 小名 小名 size = 1 **/
150
151 /** 如果改成复写toString()方法的对象 , 效果就完全不一样了 **/
152
153 </script>