成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript實(shí)現(xiàn)的HashTable(鍵值對(duì))類

wawor4827 / 2421人閱讀

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

引言

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

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

//HashTable實(shí)現(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 {
            /*本來(lái)想實(shí)現(xiàn)一個(gè)key也可以是復(fù)雜類型(如Object)的了,但是考慮下,
            實(shí)際開(kāi)發(fā)中,復(fù)雜類型當(dāng)做key的情況并不多,而且如果實(shí)現(xiàn),可能會(huì)影響
            現(xiàn)在這種利用object特性快速取值的方式,影響性能;故限制key采取必須是
            基本類型的方式。*/
            throw new Error("Key必須是一個(gè)存在值的基本類型,并且值不可為空");
        }
    };
    self.add = function (key, value) {
        key = this.checkKey(key);
        hash[key] = value;//保證key唯一,重復(fù)key,value會(huì)被覆蓋
        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;
    };
};
改進(jìn)

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78423.html

相關(guān)文章

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

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

    yzzz 評(píng)論0 收藏0
  • Hashtable源碼分析_JDK1.8版本

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

    tunny 評(píng)論0 收藏0
  • Java 集合Hashtable源碼深入解析

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

    Turbo 評(píng)論0 收藏0
  • 站在巨人肩膀上看源碼-Map

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

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

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

    Hegel_Gu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<