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的history历史记录插件
Dec 11 Javascript
jquery弹出框的用法示例(一)
Aug 26 Javascript
javascript实现简单的鼠标拖动效果实例
Apr 10 Javascript
精通JavaScript的this关键字
May 28 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 Javascript
vue2.0多条件搜索组件使用详解
Mar 26 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
微信小程序结合Storage实现搜索历史效果
May 18 Javascript
vue中keep-alive组件的入门使用教程
Jun 06 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
Jul 21 Javascript
javascript实现时钟动画
Dec 03 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
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 错误处理经验分享
2011/10/11 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
input的focus方法使用
2010/03/13 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
Python制作词云的方法
2018/01/03 Python
python破解zip加密文件的方法
2018/05/31 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
Django models文件模型变更错误解决
2020/05/11 Python
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
在校学生职业规划范文
2014/01/08 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
销售人员工作自我评价
2014/09/21 职场文书
任命通知范文
2015/04/21 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python