本文实例讲述了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(){ varcount = 0; for(variinthis.content) count++; returncount; }, //返回hashTable中的值 items:function(key){ if(this.contains(key)){ returnthis.obj[key]; } }, //增加值到hashtable add:function(key,value){ if(this.obj.hasOwnProperty(key)){ returnfalse; }else{ this.obj[key] = value; returntrue; } }, //清空hashtable中的值 clear:function(){ this.obj = {}; }, //检测hashTable对象中是否含有此属性 contains:function(key){ returnthis.obj.hasOwnProperty(key); }, //移除hashTable中对象的值 remove:function(key){ deletethis.obj[key]; } } |
这样我们就能像c#语言里面的那样进行操作了。
还一个简单的变体版:
// js哈希表 functionHashTable() { this.ObjArr = {}; this.Count = 0; //添加 this.Add =function(key, value) { if(this.ObjArr.hasOwnProperty(key)) { returnfalse;//如果键已经存在,不添加 }else{ this.ObjArr[key] = value; this.Count++; returntrue; } } //是否包含某项 this.Contains =function(key) { returnthis.ObjArr.hasOwnProperty(key); } //取某一项 其实等价于this.ObjArr[key] this.GetValue =function(key){ if(this.Contains(key)) { returnthis.ObjArr[key]; }else{ throwError("Hashtable not cotains the key: "+ String(key));//脚本错误 //return; } } //移除 this.Remove =function(key) { if(this.Contains(key)) { deletethis.ObjArr[key]; this.Count--; } } //清空 this.Clear =function(){ this.ObjArr = {};this.Count = 0; } } //员工 functionemployee(id, userName) { this.id = id; this.userName = userName; } functiontest() { varht =newHashTable(); vartmpEmployee =null; for(vari = 1; i < 6; i++) { tmpEmployee =newemployee(i,"Employee_"+ i); ht.Add(i, tmpEmployee); } for(vari = 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)); //异常 varresult = 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(){ vararr =this,obj={}; for(vari =0, len=arr.length;i<len;i++){ varkey = arr[i]; if( ! obj[key]){ obj[key] = 1; }else{ obj[key]++; } } varmax = -1,maxStr; for( keyinobj){ if(obj[key]>max){ max = obj[key]; maxStr = key; } } //alert(maxStr); return[maxStr,max]; } |