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的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。

原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1652255.html