zl程序教程

您现在的位置是:首页 >  后端

当前栏目

js模拟实现类似c#下的hashtable的简单功能代码

c#JS模拟代码 实现 简单 功能 类似
2023-06-13 09:14:15 时间
如果在c#中,我们只要用hashtable或者dictionary根据key取value的特性,就可以很轻松地实现这个功能了。其实我们稍作处理,js也可以实现类似hashtable的功能。下面总结一下笔者开发中用到的实现方式,贴代码为主。
1、实现思路:主要就是利用原型(prototype)的hasOwnProperty方法,确定对象中的项是该添加、移除还是取出某个匹配的项等。hasOwnProperty比遍历数组取值灵巧快速的地方在于:至少从代码上来看,它是O(1)复杂度的。
2、实现代码
复制代码代码如下:

//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("Hashtablenotcotainsthekey:"+String(key));//脚本错误
//return;
}
}
//移除
this.Remove=function(key){
if(this.Contains(key)){
deletethis.ObjArr[key];
this.Count--;
}
}
//清空
this.Clear=function(){
this.ObjArr={};this.Count=0;
}
}

3、测试代码
代码
复制代码代码如下:

//员工
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("EmployeeId:"+result.id+";UserName:"+result.userName);
}
ht.Add(2,"这一个key已经存在!");//Add无效
//ht.Clear();//清空
alert(ht.Count);
}

调用的时候很简单,只要new一个hashtable对象,常见的功能就都有了。是不是很简单?Enjoyit。
小结:原型链(prototype链)和作用域链是js的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。