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 布尔型分析
Dec 22 Javascript
js下将字符串当函数执行的方法
Jul 13 Javascript
javascript解析json数据的3种方式
May 08 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
javascript中加var和不加var的区别 你真的懂吗
Jan 06 Javascript
预防网页挂马的方法总结
Nov 03 Javascript
详解Node.js串行化流程控制
May 04 Javascript
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
.vue文件 加scoped 样式不起作用的解决方法
May 28 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
May 29 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
Jun 05 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
星际RPG字典
2020/03/04 星际争霸
PHP insert语法详解
2008/06/07 PHP
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
php session劫持和防范的方法
2013/11/12 PHP
php微信开发自定义菜单
2016/08/27 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
解释&amp;&amp;和||在javascript中的另类用法
2014/07/28 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Python面向对象编程基础解析(二)
2017/10/26 Python
python之信息加密题目详解
2019/06/26 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python__new__内置静态方法使用解析
2020/01/07 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
婴儿地球:Baby Earth
2018/12/25 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
北京SQL新华信咨询
2016/09/30 面试题
Linux的文件类型
2016/07/05 面试题
Linux的文件类型
2012/03/07 面试题
应届毕业生求职自荐书
2014/01/03 职场文书
小学生打架检讨书
2014/01/26 职场文书
上课不认真检讨书
2014/09/17 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
Golang解析JSON对象
2022/04/30 Golang