契机:
现在做的项目中有一个省份城市的级联下拉框,为了对从后台获取的到的值进行处理,打算用两个for循环装配对象。
后台返回结果数据结构:
{ name:浙江省; code:01; parentCode:0 } { name:杭州; code:0101; parentCode:01; } { name:宁波; code:0102; parentCode:01; }
总共373条数据;后台返回直接通过parentCode 排序;省份永远在前;
定义数据结构:
var province = function createProvince(name,code,citys){ var province = new Object(); province.name = name; province.code = code; province.citys = citys; return province; } var city= function createProvince(name,code,parentCode){ var city= new Object(); city.name = name; city.code = code; city.parentCode = parentCode; return city; }
做到这里,感觉还是很轻松,因为js中没有hashMap,只能同过两个嵌套的for循环处理;
var provinces = new Array(); var data = $.ajax{}//伪代码 for(int i=0;i<data.length;i++) { if(data.parentCode == 0){ provinces.push(creatrProvince(data[i].name,data[i.code,[]])); } if(data.parentCode != 0){ for(int j = 0;j<provinces.length;j++){ if(data[i].parentCode == provinces[j].code){ provinces[j].citys.push(data[i]) } } } }
逻辑很清楚,但是意想不到的是浏览器崩溃了;
、、、我目前还不知道是什么原因,但是我当时觉得是算法不行。
算法复杂度是:O(N^2);
好吧,到这时候不得不去想一想在js中实现hashmap的方法了;
网上抄了一份:
/** *作者 :Fantasy *Email: [email protected] *QQ : 8635335 *Blog : http://www.blogjava.net/fantasy *版本 :V1.1 */ function HashMap() { /** Map 大小 **/ var size = 0; /** 对象 **/ var entry = new Object(); /** 存 **/ this.put = function (key , value) { if(!this.containsKey(key)) { size ++ ; } entry[key] = value; } /** 取 **/ this.get = function (key) { return this.containsKey(key) ? entry[key] : null; } /** 删除 **/ this.remove = function ( key ) { if( this.containsKey(key) && ( delete entry[key] ) ) { size --; } } /** 是否包含 Key **/ this.containsKey = function ( key ) { return (key in entry); } /** 是否包含 Value **/ this.containsValue = function ( value ) { for(var prop in entry) { if(entry[prop] == value) { return true; } } return false; } /** 所有 Value **/ this.values = function () { var values = new Array(); for(var prop in entry) { values.push(entry[prop]); } return values; } /** 所有 Key **/ this.keys = function () { var keys = new Array(); for(var prop in entry) { keys.push(prop); } return keys; } /** Map Size **/ this.size = function () { return size; } /* 清空 */ this.clear = function () { size = 0; entry = new Object(); } } var map = new HashMap(); /* map.put("A","1"); map.put("B","2"); map.put("A","5"); map.put("C","3"); map.put("A","4"); */ /* alert(map.containsKey("XX")); alert(map.size()); alert(map.get("A")); alert(map.get("XX")); map.remove("A"); alert(map.size()); alert(map.get("A")); */ /** 同时也可以把对象作为 Key **/ /* var arrayKey = new Array("1","2","3","4"); var arrayValue = new Array("A","B","C","D"); map.put(arrayKey,arrayValue); var value = map.get(arrayKey); for(var i = 0 ; i < value.length ; i++) { //alert(value[i]); } */ /** 把对象做为Key时 ,自动调用了该对象的 toString() 方法 其实最终还是以String对象为Key**/ /** 如果是自定义对象 那自己得重写 toString() 方法 否则 . 就是下面的结果 **/ function MyObject(name) { this.name = name; } /** function MyObject(name) { this.name = name; this.toString = function () { return this.name; } } **/ var object1 = new MyObject("小张"); var object2 = new MyObject("小名"); map.put(object1,"小张"); map.put(object2,"小名"); alert(map.get(object1)); alert(map.get(object2)); map.remove("xxxxx"); alert(map.size()); /** 运行结果 小名 小名 size = 1 **/ /** 如果改成复写toString()方法的对象 , 效果就完全不一样了 **/
原文链接:http://am-human.iteye.com/blog/1570452
我对js也不是很懂,但是好像是用了array()的contains()方法;在java中,这也是循环遍历实现的;
这个hashMap的性能并不好,而且是通过对象中存入key-value对实现的;
所以有如下想法:
直接new一个Object;
将code作为key;
存province为value;
var provincelist = new Object(); var data = $.ajax{}//伪代码 for(int i=0;i<data.length;i++) { if(data.parentCode == 0){ var province = creatrProvince(data[i].name,data[i].code,[]]); provincelist[data.code] = province; } if(data.parentCode != 0){ for(int j = 0;j<provinces.length;j++){ var city = createcity(data[i].name,data[i].code,data[i].parentCode); var pro = provincelist[city.parentCode];//直接通过code取得元素; if(!isUndefinedOrNull(pro)){ pro.citys.push(city); } } } }
ok,这个问题就解决完了。这里我并不清楚JavaScript对象实现这种方法的原理;仍然在搜索资料中,有哪位大神知道请不吝赐教!