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 相关文章推荐
js每次Title显示不同的名言
Sep 25 Javascript
Javascript学习笔记4 Eval函数
Jan 11 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
Oct 18 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
Oct 17 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
jQuery解析json格式数据示例
Sep 01 jQuery
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
js 将线性数据转为树形的示例代码
May 28 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
JS+CSS实现炫酷光感效果
Sep 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
来自phpguru得Php Cache类源码
2010/04/15 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
JavaScript触发器详解
2007/03/10 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js确定对象类型方法
2012/03/30 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
Python编写检测数据库SA用户的方法
2014/07/11 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
初中语文教学反思
2014/02/02 职场文书
顶碗少年教学反思
2014/02/21 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
大国崛起观后感
2015/06/02 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
Elasticsearch 索引操作和增删改查
2022/04/19 Python