js的hash实现?

契机:

现在做的项目中有一个省份城市的级联下拉框,为了对从后台获取的到的值进行处理,打算用两个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对象实现这种方法的原理;仍然在搜索资料中,有哪位大神知道请不吝赐教!

猜你喜欢

转载自windside214.iteye.com/blog/2302509
今日推荐