js 模拟实现类似c#下的hashtable的简单功能代码

时间:2024-04-19 09:44:51 

如果在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的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。

标签:js,hashtable
0
投稿

猜你喜欢

  • 一文带你深入了解Go语言中切片的奥秘

    2024-04-28 10:46:25
  • 基于Oracle多库查询方法(分享)

    2024-01-13 12:09:03
  • 在js中的replace方法详解

    2007-08-21 15:47:00
  • python中aioysql(异步操作MySQL)的方法

    2024-01-15 22:15:26
  • 好友列表利用率越高,社区越失败

    2008-04-10 12:22:00
  • Python爬取365好书中小说代码实例

    2023-05-31 21:25:55
  • Vue表单之v-model绑定下拉列表功能

    2024-05-13 09:07:07
  • Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    2022-02-26 00:53:49
  • Git 命令使用技巧提供工作效率

    2022-05-11 18:01:33
  • python中ASCII码字符与int之间的转换方法

    2023-05-20 08:47:29
  • python中np.random.permutation函数实例详解

    2021-10-13 16:18:35
  • 对pytorch网络层结构的数组化详解

    2023-09-02 12:10:09
  • YOLOv8训练自己的数据集(详细教程)

    2021-07-12 20:59:18
  • 2010 图标设计趋势

    2010-12-17 12:44:00
  • 用python实现简单EXCEL数据统计的实例

    2021-12-30 09:59:01
  • SQL Server 性能调优之查询从20秒至2秒的处理方法

    2024-01-24 14:01:56
  • python使用urllib2模块获取gravatar头像实例

    2022-12-11 03:16:36
  • oracle 彻底删除方法

    2009-07-02 12:22:00
  • 在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs

    2024-05-11 09:26:35
  • 模拟兼容性的 addDOMLoadEvent 事件

    2009-07-31 12:37:00
  • asp之家 网络编程 m.aspxhome.com