zoukankan      html  css  js  c++  java
  • javascript模拟实现类似c#下的hashtable的简单功能

    越来越感觉js对集合的处理没有c#强大。比如在实际开发中,经常用到在一维数组或者二维数组里取某一个满足某些条件的项,通常的处理方式就是遍历数组,对比条件,匹配就取出,然后结束循环。如果在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的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。

  • 相关阅读:
    摄影/中秋美食
    摄影/不是花中偏爱菊
    基础知识(3)- Java的基本程序设计结构
    8、分页
    洛谷——P2440 木材加工
    洛谷——P1258 小车问题
    洛谷——P1832 A+B Problem(再升级)
    洛谷——P1802 5倍经验日
    洛谷—— P1803 凌乱的yyy
    网络基础之网络协议
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1652255.html
Copyright © 2011-2022 走看看