随笔 - 268  文章 - 0  评论 - 1028  阅读 - 160万

javascript模拟实现类似c#下的hashtable的简单功能

越来越感觉js对集合的处理没有c#强大。比如在实际开发中,经常用到在一维数组或者二维数组里取某一个满足某些条件的项,通常的处理方式就是遍历数组,对比条件,匹配就取出,然后结束循环。如果在c#中,我们只要用hashtable或者dictionary根据key取value的特性,就可以很轻松地实现这个功能了。其实我们稍作处理,js也可以实现类似hashtable的功能。下面总结一下笔者开发中用到的实现方式,贴代码为主。

1、实现思路:主要就是利用原型(prototype)的hasOwnProperty方法,确定对象中的项是该添加、移除还是取出某个匹配的项等。hasOwnProperty比遍历数组取值灵巧快速的地方在于:至少从代码上来看,它是O(1)复杂度的。
2、实现代码

复制代码
代码
// 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;
    }
}
复制代码

 3、测试代码

复制代码
代码

//员工
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);

}
复制代码

 调用的时候很简单,只要new一个hashtable对象,常见的功能就都有了。是不是很简单?Enjoy it。

小结:原型链(prototype链)和作用域链是js的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。

posted on   JeffWong  阅读(899)  评论(3编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2010年1月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

I know how to make it works and I want to know how it works.
点击右上角即可分享
微信分享提示