亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

學(xué)習(xí)Redis你必須了解的數(shù)據(jù)結(jié)構(gòu)——JS實現(xiàn)集合和ECMA6集合

Original 2016-11-07 16:15:50 613
abstrakt:集合類似于數(shù)組,但是集合中的元素是唯一的,沒有重復(fù)值的。就像你學(xué)高中數(shù)學(xué)的概念一樣,集合還可以做很多比如,并集,交集,差集的計算。在ECMA6之前,JavaScript沒有提供原生的Set類,所以只能手動實現(xiàn),不過手動實現(xiàn)的好處在于,幫助我們了解集合的原理。關(guān)于Redis集合的應(yīng)用,你可以移步到這篇文章Redis命令拾遺四(集合類型)—包含簡單搜索篩選商品設(shè)計實例。  。今天關(guān)于集合的分

集合類似于數(shù)組,但是集合中的元素是唯一的,沒有重復(fù)值的。就像你學(xué)高中數(shù)學(xué)的概念一樣,集合還可以做很多比如,并集,交集,差集的計算。在ECMA6之前,JavaScript沒有提供原生的Set類,所以只能手動實現(xiàn),不過手動實現(xiàn)的好處在于,幫助我們了解集合的原理。關(guān)于Redis集合的應(yīng)用,你可以移步到這篇文章Redis命令拾遺四(集合類型)—包含簡單搜索篩選商品設(shè)計實例。  。今天關(guān)于集合的分享使用做Web的都會的JS來實現(xiàn)。我們先集合類定義如下方法,增加,批量增加,包含?,移除,清空,查詢所有,大小,并集,交集,差集。

18.png

具體實現(xiàn)如下:

 function Set() {
        var items = {};                             //對象中鍵名是唯一的
        this.add = function (value) {
            if (value != undefined) {
                items[value] = value;               //新增   鍵名和值名相同
                return true;
            } else {
                return false;
            }
        };
        this.multiAdd = function (values) {
            if (values.constructor == Array) {              //是否為數(shù)組
                values.forEach(function (value) {
                    if (value != undefined) {
                        items[value] = value;               //新增   鍵名和值名相同
                    } else {
                        return false;
                    }
                });
                return true;
            }
        };
        this.has = function (value) {
            return items.hasOwnProperty(value);     //是否有該屬性(對象中屬性名和值相同)
        };
        this.remove = function (value) {
            if (this.has[value]) {
                delete items[value];                //有則delete  返回true
                return true;
            }
            return false;
        };
        this.clear = function () {
            items = {};                             //清空
        };
        this.values = function () {
            return Object.keys(items);              //返回所有值
        };
        this.size = function () {
            return Object.keys(items).length;       //大小
        };
        this.union = function (otherSet) {          //并集
            var unionSet = new Set();
            var values = this.values();
            values.forEach(function (value) {
                unionSet.add(value);
            });
            var otherValues = otherSet.values();
            otherValues.forEach(function (otherValue) {     //由于對象屬性本身不能重復(fù),所以兩個集合值直接合并
                unionSet.add(otherValue)
            });
            return unionSet;
        };
        this.diff = function (otherSet) {                   //差集
            var diffSet = new Set();
            var values = this.values();
            var otherValues = otherSet.values();
            values.forEach(function (value) {
                if (!otherValues.has(values)) {             //排除另一個集合的所有值
                    diffSet.add(value);
                }
            });
            return diffSet;
        };
        this.interSection = function (onherSet) {           //交集
            var diffSet = new Set();
            var values = this.values();
            var otherValues = otherSet.values();
            values.forEach(function (value) {
                if (otherValues.has(values)) {              //取相同值
                    diffSet.add(value);
                }
            });
            return diffSet;
        };
    }

詳細(xì)注釋已經(jīng)在代碼中給出。

在ECMA6出現(xiàn)之后,你可以直接使用原生的Set類。

19.png

原生類依然提供了如下方法:

 20.png

了解了基本的實現(xiàn)原理,也就明白了為什么大數(shù)據(jù)量下,生產(chǎn)環(huán)境中Redis要盡量少使用集合來做運算。或者說Redis為什么提供了一種命令,可以直接緩存集合計算結(jié)果到新的集合當(dāng)中。


Versionshinweise

Beliebte Eintr?ge