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


Posted in Javascript onJanuary 24, 2010

如果在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的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。
Javascript 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
date.parse在IE和FF中的区别
Jul 29 Javascript
Javascript继承机制的设计思想分享
Aug 28 Javascript
Javascript函数的参数
Jul 16 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
Dec 17 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
微信小程序 select 下拉框组件功能
Sep 09 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
Jan 24 #Javascript
优化javascript的执行速度
Jan 23 #Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 #Javascript
JQuery 1.4 中的Ajax问题
Jan 23 #Javascript
用JS写的一个TableView控件代码
Jan 23 #Javascript
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 #Javascript
JavaScript 学习笔记(十四) 正则表达式
Jan 22 #Javascript
You might like
php下使用iconv需要注意的问题
2010/11/20 PHP
php curl的深入解析
2013/06/02 PHP
PHP比你想象的好得多
2014/11/27 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript offsetX与layerX区别
2010/03/12 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
js对象的复制继承实例
2015/01/10 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
python中的变量如何开辟内存
2018/06/26 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
化工操作工岗位职责
2014/04/29 职场文书
合作意向书
2014/07/30 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
python中的random模块和相关函数详解
2022/04/22 Python
Java对文件的读写操作方法
2022/04/29 Java/Android