您好,欢迎访问一九零五行业门户网

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

如果在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 tmpemployee = new employee(i, employee_ + i);
ht.add(i, tmpemployee);
}
for (var i = 1; 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的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。
其它类似信息

推荐信息