国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript實現的HashTable(鍵值對)類

wawor4827 / 2363人閱讀

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

引言

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

實現
//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實現
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 {
            /*本來想實現一個key也可以是復雜類型(如Object)的了,但是考慮下,
            實際開發中,復雜類型當做key的情況并不多,而且如果實現,可能會影響
            現在這種利用object特性快速取值的方式,影響性能;故限制key采取必須是
            基本類型的方式。*/
            throw new Error("Key必須是一個存在值的基本類型,并且值不可為空");
        }
    };
    self.add = function (key, value) {
        key = this.checkKey(key);
        hash[key] = value;//保證key唯一,重復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([]);
    };
    //根據key獲取值
    self.getValue = function (key) {
        if (hash.hasOwnProperty(key)) {
            return hash[key];
        }
    };
    //提供快捷遍歷函數
    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;
    };
};
改進

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78423.html

相關文章

  • Map總結,看這篇就夠了

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

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

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

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

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

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

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

    xiaotianyi 評論0 收藏0
  • js數據結構和算法(五)字典和散列(hash)

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

    Hegel_Gu 評論0 收藏0

發表評論

0條評論

wawor4827

|高級講師

TA的文章

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