成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript實現(xiàn)的HashTable(鍵值對)類

wawor4827 / 2372人閱讀

摘要:原生中同樣也沒有實現(xiàn)的數(shù)據(jù)類型注意是類型,并不是結(jié)構(gòu),有與它類似的數(shù)據(jù)結(jié)構(gòu),的其實本質(zhì)上就是一種的形式,他可以看做是一種的數(shù)據(jù)結(jié)構(gòu)。下面,我會用到的特性來實現(xiàn)這種數(shù)據(jù)類型。所以綜合考慮后,編寫了正文實現(xiàn)中的代碼。

引言

在后端語言中存在HashTable數(shù)據(jù)結(jié)構(gòu),他可以以一種key/value的形式保存數(shù)據(jù),同時也可以通過key快速獲取value的值。這是一種很便捷也很常用的功能。
原生JS中同樣也沒有實現(xiàn)HashTable的數(shù)據(jù)類型(注意是類型,并不是結(jié)構(gòu)),有與它類似的數(shù)據(jù)結(jié)構(gòu)——Object,JS的Object其實本質(zhì)上就是一種key/value的形式,他可以看做是一種HashTable的數(shù)據(jù)結(jié)構(gòu)。
下面,我會用到Object的特性來實現(xiàn)HashTable這種數(shù)據(jù)類型。

實現(xiàn)
//trim方法借鑒jQuery
var whitespace = "[x20	
f]",
    rtrim = new RegExp("^" + whitespace + "+|((?:^|[^])(?:.)*)" + whitespace + "+$", "g");
//直接在string的原型上做了擴展
String.prototype.trim = String.prototype.trim || function () {
    return this.treplace(rtrim, "");
};

//HashTable實現(xiàn)
function HashTable() {
    var self = this,
        hash = {},
        count = 0,
        keys = [],
        values = [];
    self.checkKey = function (key) {
        if ((typeof key === "string" && key.trim !== "") || typeof key === "number" || typeof key === "boolean") {
            return key;
        } else {
            /*本來想實現(xiàn)一個key也可以是復(fù)雜類型(如Object)的了,但是考慮下,
            實際開發(fā)中,復(fù)雜類型當做key的情況并不多,而且如果實現(xiàn),可能會影響
            現(xiàn)在這種利用object特性快速取值的方式,影響性能;故限制key采取必須是
            基本類型的方式。*/
            throw new Error("Key必須是一個存在值的基本類型,并且值不可為空");
        }
    };
    self.add = function (key, value) {
        key = this.checkKey(key);
        hash[key] = value;//保證key唯一,重復(fù)key,value會被覆蓋
        count++;
        if (keys.indexOf(key) == -1) {
            keys.push(key);
        }
        if (values.indexOf(value) == -1) {
            values.push(value);
        }
        return self;
    };
    self.remove = function (key) {
        key = this.checkKey(key);
        if (hash.hasOwnProperty(key)) {
            var value = hash[key];
            delete hash[key];
            count--;
            if (count < 0) {
                count = 0;
            }
            var kIndex = keys.indexOf(key),
                vIndex = values.indexOf(value);
            if (kIndex != -1) {
                keys.splice(kIndex, 1);
            }
            if (vIndex != -1) {
                values.splice(vIndex, 1);
            }
        }
        return self;
    };
    self.clear = function () {
        for (var i = 0; i < keys.length; i++) {
            if (hash.hasOwnProperty(keys[i])) {
                delete hash[keys[i]];
            }
        }
        keys.splice(0, keys.length);
        values.splice(0, values.length);
        return self;
    };
    self.count = function () {
        return count;
    };
    self.contains = function (key) {
        return keys.indexOf(key) !== -1;;
    };
    self.containsKey = function (key) {
        return keys.indexOf(key) !== -1;
    };
    self.containsValue = function (value) {
        return values.indexOf(value) !== -1;
    };
    self.getKeys = function () {
        return keys.concat([]);
    };
    self.getValues = function () {
        return values.concat([]);
    };
    //根據(jù)key獲取值
    self.getValue = function (key) {
        if (hash.hasOwnProperty(key)) {
            return hash[key];
        }
    };
    //提供快捷遍歷函數(shù)
    self.each = function (fun) {
        if (typeof fun === "function") {
            for (var i = 0; i < keys.length; i++) {
                var key = keys[i],
                    value = hash[key];
                var stop = fun.call({
                    key: key,
                    value: value
                }, key, value);
                if (stop === false) break;
            }
        }
    };
    self.toList = function () {
        var result = [];
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i],
                value = hash[key];
            result.push({
                key: key,
                value: value
            });
        }
        return result;
    };
};
改進

第一版實現(xiàn)中,我是在add方法中,直接將key加載了HashTable這個類的實例上的,這樣做的好處是:可以更接近類似的后端使用方式,如下:

var ht = new HashTable();
ht.add("key1","value1");
ht["key2"]="value2";
ht.getValue("key2");//value2
ht["key1"];//value1

這樣的實現(xiàn)會在使用時提供更大便捷,但是數(shù)據(jù)有效性不能保證,如:如果key是HashTable實例的一個方法名,那就有可能被覆蓋,方法會失靈。
所以綜合考慮后,編寫了正文【實現(xiàn)】中的代碼。
如果大家有更好的實現(xiàn)方式也可以分享,大家一起學(xué)習(xí)~~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78423.html

相關(guān)文章

  • Map總結(jié),看這篇就夠了

    摘要:繼承于,實現(xiàn)了接口。的定義的定義從中,我們可以看出和都實現(xiàn)了接口。指向的的總的大小是迭代器還是枚舉類的標志為,表示它是迭代器否則,是枚舉類。默認加載因子指定容量大小的構(gòu)造函數(shù)當?shù)膶嶋H容量閾值時,閾值總的容量加載因子,就將的容量翻倍。 概要 學(xué)完了Map的全部內(nèi)容,我們再回頭開開Map的框架圖。showImg(https://segmentfault.com/img/remote/146...

    yzzz 評論0 收藏0
  • Hashtable源碼分析_JDK1.8版本

    摘要:簡介聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處聲明和一樣也是散列表,存儲元素也是鍵值對繼承于類類聲明了操作鍵值對的接口方法,實現(xiàn)接口定義鍵值對接口大部分類用修飾,證明是線程安全的基本數(shù)據(jù)結(jié)構(gòu)鍵值對數(shù)組,每個本質(zhì)上是一個單向鏈表的表頭閾值裝填因 Hashtable簡介 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處https://segmentfault.com/u/yzwall Hashta...

    tunny 評論0 收藏0
  • Java 集合Hashtable源碼深入解析

    摘要:分別獲取正序反序的鍵集。是用來實現(xiàn)機制的第部分源碼解析基于為了更了解的原理,下面對源碼代碼作出分析。實現(xiàn)了迭代器和枚舉兩個接口獲取的迭代器若的實際大小為則返回空迭代器對象否則,返回正常的的對象。 概要 前面,我們已經(jīng)系統(tǒng)的對List進行了學(xué)習(xí)。接下來,我們先學(xué)習(xí)Map,然后再學(xué)習(xí)Set;因為Set的實現(xiàn)類都是基于Map來實現(xiàn)的(如,HashSet是通過HashMap實現(xiàn)的,TreeSe...

    Turbo 評論0 收藏0
  • 站在巨人肩膀上看源碼-Map

    摘要:在學(xué)習(xí)的實現(xiàn)類是基于實現(xiàn)的前,先來介紹下接口及其下的子接口先看下的架構(gòu)圖如上圖是映射接口,中存儲的內(nèi)容是鍵值對。是繼承于的接口。中的內(nèi)容是排序的鍵值對,排序的方法是通過比較器。 Map 在學(xué)習(xí)Set(Set的實現(xiàn)類是基于Map實現(xiàn)的)、HashMap、TreeMap前,先來介紹下Map接口及其下的子接口.先看下Map的架構(gòu)圖:showImg(https://segmentfault.c...

    xiaotianyi 評論0 收藏0
  • js數(shù)據(jù)結(jié)構(gòu)和算法(五)字典和散列(hash)

    摘要:哈希表也是種數(shù)據(jù)結(jié)構(gòu),它可以提供快速的插入操作和查找操作。一個更好的散列函數(shù)為了避免碰撞,首先要確保散列表中用來存儲數(shù)據(jù)的數(shù)組其大小是個質(zhì)數(shù),這和計算散列值時使用的取余運算有關(guān)。散列函數(shù)將學(xué)生里的數(shù)字相加,使用函數(shù)計算出散列值。 什么是字典結(jié)構(gòu)? 字典是以鍵值對形式存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),就像電話號碼薄里的名字和電話號碼那樣的一一對應(yīng)的關(guān)系。 javascript的Object類就是以...

    Hegel_Gu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<