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对表单操作2
Apr 06 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
详解JavaScript数组的操作大全
Oct 19 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
几行js代码实现自适应
Feb 24 Javascript
jQuery使用unlock.js插件实现滑动解锁
Apr 04 jQuery
深入探究angular2 UI组件之primeNG用法
Jul 26 Javascript
Vue实现点击时间获取时间段查询功能
Aug 21 Javascript
微信小程序实现抖音播放效果的实例代码
Apr 11 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
May 18 Javascript
mpvue 项目初始化及实现授权登录的实现方法
Jul 20 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中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
浅谈PHP中的
2016/04/23 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
Python实现购物车程序
2018/04/16 Python
详解Python如何生成词云的方法
2018/06/01 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
关于期中考试的反思
2014/02/02 职场文书
节能环保口号
2014/06/12 职场文书
普宁寺导游词
2015/02/04 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android