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 相关文章推荐
JavaScript 继承使用分析
May 12 Javascript
jquery动态添加删除div 具体实现
Jul 20 Javascript
ext combobox动态加载数据库数据(附前后台)
Jun 17 Javascript
js实现多选项切换导航菜单的方法
Feb 06 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
JS框架之vue.js(深入三:组件1)
Sep 29 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
浅谈js中的bind
Mar 18 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
Jul 24 Javascript
JavaScript的console命令使用实例
Dec 03 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
第十二节--类的自动加载
2006/11/16 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
JS回调函数深入理解
2019/10/16 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python爬虫增加访问量的方法
2019/08/22 Python
python时间日期操作方法实例小结
2020/02/06 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
Python 必须了解的5种高级特征
2020/09/10 Python
Python colormap库的安装和使用详情
2020/10/06 Python
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
英国在线购买轮胎、预订汽车、汽车维修和装配网站:Protyre
2020/04/12 全球购物
志愿者服务感言
2014/02/27 职场文书
关于保护环境的建议书
2014/08/26 职场文书
中班上学期个人总结
2015/02/12 职场文书
小学运动会入场词
2015/07/18 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书