锁定老帖子 主题:一个简单的JavaScript Map
精华帖 (0) :: 良好帖 (0) :: 新手帖 (22) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-25
用js写了一个Map,带遍历功能,请大家点评下啦。 //map.js Array.prototype.remove = function(s) { for (var i = 0; i < this.length; i++) { if (s == this[i]) this.splice(i, 1); } } /** * Simple Map * * * var m = new Map(); * m.put('key','value'); * ... * var s = ""; * m.each(function(key,value,index){ * s += index+":"+ key+"="+value+"\n"; * }); * alert(s); * * @author dewitt * @date 2008-05-24 */ function Map() { /** 存放键的数组(遍历用到) */ this.keys = new Array(); /** 存放数据 */ this.data = new Object(); /** * 放入一个键值对 * @param {String} key * @param {Object} value */ this.put = function(key, value) { if(this.data[key] == null){ this.keys.push(key); } this.data[key] = value; }; /** * 获取某键对应的值 * @param {String} key * @return {Object} value */ this.get = function(key) { return this.data[key]; }; /** * 删除一个键值对 * @param {String} key */ this.remove = function(key) { this.keys.remove(key); this.data[key] = null; }; /** * 遍历Map,执行处理函数 * * @param {Function} 回调函数 function(key,value,index){..} */ this.each = function(fn){ if(typeof fn != 'function'){ return; } var len = this.keys.length; for(var i=0;i<len;i++){ var k = this.keys[i]; fn(k,this.data[k],i); } }; /** * 获取键值数组(类似Java的entrySet()) * @return 键值对象{key,value}的数组 */ this.entrys = function() { var len = this.keys.length; var entrys = new Array(len); for (var i = 0; i < len; i++) { entrys[i] = { key : this.keys[i], value : this.data[i] }; } return entrys; }; /** * 判断Map是否为空 */ this.isEmpty = function() { return this.keys.length == 0; }; /** * 获取键值对数量 */ this.size = function(){ return this.keys.length; }; /** * 重写toString */ this.toString = function(){ var s = "{"; for(var i=0;i<this.keys.length;i++,s+=','){ var k = this.keys[i]; s += k+"="+this.data[k]; } s+="}"; return s; }; } function testMap(){ var m = new Map(); m.put('key1','Comtop'); m.put('key2','南方电网'); m.put('key3','景新花园'); alert("init:"+m); m.put('key1','康拓普'); alert("set key1:"+m); m.remove("key2"); alert("remove key2: "+m); var s =""; m.each(function(key,value,index){ s += index+":"+ key+"="+value+"\n"; }); alert(s); } //testMap.htm <html> <head> <title>Test Map</title> <script language="javascript" src="map.js"> </script> </head> <body> <input type="button" value="test" onclick="testMap()"> </body> </html>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-25
var map = {};
map["key1"] = "Value1"; // 加入值对 map["key2"] = "Value2"; map["key3"] = "Value3"; ... if("key1" in map) { //判断是否存在 alert("OK"); } for(var k in map) { // 遍历 alert(k + " = " + map[k]); } ... delete map["key1"]; // 删除 |
|
返回顶楼 | |
发表时间:2008-05-25
外观是对了 不过查找复杂度不对吧
|
|
返回顶楼 | |
发表时间:2008-05-25
用foreach遍历不对的啊,会有一些对象原来的属性也拿到了
用了js这么久,还没见过delete这个关键字,原本还以为不能删除属性,惭愧 |
|
返回顶楼 | |
发表时间:2008-05-25
TO csf177:
查找复杂度不对是什么意思? |
|
返回顶楼 | |
发表时间:2008-05-25
for(var k in map) { // 遍历
alert(k + " = " + map[k]); } 这样遍历对象竟然完全正确,受教了。 之前测试Array时发现foreach拿到的数据不对,没分析下原因就把Object也当成了这样,结果误导了自己,哎 |
|
返回顶楼 | |
发表时间:2008-05-26
kylixs 写道 TO csf177:
查找复杂度不对是什么意思? js对象的索引效率是依赖实现的 通常是占用内存很大的Hashmap Map时间复杂度一般应该是O(ln N) 而空间复杂度是O(N) |
|
返回顶楼 | |
发表时间:2008-05-26
myy 写道 var map = {};
map["key1"] = "Value1"; // 加入值对 map["key2"] = "Value2"; map["key3"] = "Value3"; ... if("key1" in map) { //判断是否存在 alert("OK"); } for(var k in map) { // 遍历 alert(k + " = " + map[k]); } ... delete map["key1"]; // 删除 Object的原生属性你怎么处理? |
|
返回顶楼 | |
发表时间:2008-05-26
Object的原生属性你怎么处理?
------------------------ 你试过了吗? |
|
返回顶楼 | |
发表时间:2008-05-26
myy 写道 Object的原生属性你怎么处理?
------------------------ 你试过了吗? 你这样做判断是否存在 会有问题 |
|
返回顶楼 | |