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 相关文章推荐
IE php关于强制下载文件的代码
Aug 23 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
May 14 Javascript
JavaScript实现网页截图功能
Oct 16 Javascript
Jquery api 速查表分享
Jan 12 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
Mar 12 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
AngularJs 指令详解及示例代码
Sep 01 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
Feb 16 Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 Javascript
基于JavaScript实现简单扫雷游戏
Jan 02 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 mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
15 个 JavaScript Web UI 库
2010/05/19 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
js实现简单的验证码
2015/12/25 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
企事业单位求职者的自我评价
2013/12/28 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书