js实现hashtable的赋值、取值、遍历

  哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值、取值、遍历、排序操作提高效率。想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面的出现最多的次数,那么这里我们可能就要用Hashtable的相关知识了。Javascript中,object的实现就是hash表,因此只要在object上封装点方法,再利用原生的hasOwnProperty方法就可以实现简单高效的hashtable。

一,什么是哈希表(Hashtable)

二,哈希表的简单操作

三,js模拟哈希表的简单操作

 

一,什么是哈希表(Hashtable)

   Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。

二,哈希表的简单操作C#

  在哈希表中添加一个key/value键值对:

HashtableObject.Add(key,value);

  在哈希表中去除某个key/value键值对:

HashtableObject.Remove(key);

  从哈希表中移除所有元素:

HashtableObject.Clear();

  判断哈希表是否包含特定键key:

HashtableObject.Contains(key);

三,js模拟哈希表的简单操作

    HashTable.prototype = {
                contructor:HashTable,
                //初始化
                initialize:function(){
                    this.obj = {};
                },
                //获取hashTable中对象唯一出现的次数
                count:function(){
                    var count = 0;
                    for(var i in this.content) count++;
                    return count;
                },
                //返回hashTable中的值
                items:function(key){
                    if(this.contains(key)){
                        return this.obj[key];
                    }
                },
                //增加值到hashtable
                add:function(key,value){
                    if(this.obj.hasOwnProperty(key)){
                        return false;
                    }else{
                        this.obj[key] = value;
                        return true;
                    }
                },
                //清空hashtable中的值
                clear:function(){
                    this.obj = {};
                },
                //检测hashTable对象中是否含有此属性
                contains:function(key){
                    return this.obj.hasOwnProperty(key);
                },
                //移除hashTable中对象的值
                remove:function(key){
                    delete this.obj[key];
                }
            } 

  这样我们就能像c#语言里面的那样进行操作了。

  还一个简单的变体版:

        // js哈希表 
        function HashTable() { 
            this.ObjArr = {}; 
            this.Count = 0; 
            //添加 
            this.Add = function(key, value) { 
                if (this.ObjArr.hasOwnProperty(key)) { 
                    return false; //如果键已经存在,不添加 
                }else { 
                    this.ObjArr[key] = value; 
                    this.Count++; 
                    return true; 
                } 
            } 
            //是否包含某项 
            this.Contains = function(key) { 
                return this.ObjArr.hasOwnProperty(key); 
            } 
            //取某一项 其实等价于this.ObjArr[key] 
            this.GetValue = function(key){ 
                if (this.Contains(key)) { 
                    return this.ObjArr[key]; 
                }else { 
                    throw Error("Hashtable not cotains the key: " + String(key)); //脚本错误 
                    //return; 
                } 
            } 
            //移除 
            this.Remove = function(key) { 
                if (this.Contains(key)) { 
                    delete this.ObjArr[key]; 
                    this.Count--; 
                } 
            } 
            //清空 
            this.Clear = function(){ 
                this.ObjArr = {}; this.Count = 0; 
            } 
        }         
                
        //员工 
        function employee(id, userName) { 
            this.id = id; 
            this.userName = userName; 
        } 
        function test() { 
            var ht = new HashTable(); 
            var tmpEmployee = null; 
            for (var i = 1; i < 6; i++) { 
                tmpEmployee = new employee(i, "Employee_" + i); 
                ht.Add(i, tmpEmployee); 
            } 
            for (var i = 1; i <= ht.Count; i++) { 
                alert(ht.GetValue(i).userName); //其实等价于ht.ObjArr[i].userName 
                //alert(ht.ObjArr[i].userName); 
            } 
            ht.Remove(1); 
            alert(ht.Contains(1)); //false 
            alert(ht.Contains(2)); //true 
            //alert(ht.GetValue(1)); //异常 
            var result = ht.GetValue(2); 
            if (result != null) { 
                alert("Employee Id:" + result.id + ";UserName:" + result.userName); 
            } 
            ht.Add(2, "这一个key已经存在!"); //Add无效 
            //ht.Clear(); //清空 
            alert(ht.Count); 
        }     

 

  最后解决一下,开头说的那个问题

        Array.prototype.maxNum = function(){
            var arr = this,obj={};
            for(var i =0, len=arr.length;i<len;i++){
                var key = arr[i];
                if( ! obj[key]){
                    obj[key] = 1;
                }else{
                    obj[key]++;
                }
            }
            var max = -1,maxStr;
            for( key in obj){
                if(obj[key]>max){
                    max = obj[key];
                    maxStr = key;
                }
            }
            //alert(maxStr);
            return [maxStr,max];
        }

 

资料来源:C#中hashtable的赋值、取值、遍历、排序操作

     利用hasOwnProperty实现的高效的javascript hashtable 

posted @ 2015-03-12 15:15  小小平凡世界  阅读(5066)  评论(0编辑  收藏  举报