1. 程式人生 > >用ES5模擬實現ES6中的Map類

用ES5模擬實現ES6中的Map類

fun 遍歷 false 創建 per 映射 .get script 實例

ECMAScript6原生實現了Map類,即我們所說的字典,字典和集合很像,不過集合是以值值得形式存儲元素,字典則是以鍵值的形式存儲元素。字典也叫映射。

1. 創建一個字典

function Map() {
    var items = {};
}

與Set類一樣,我們用Object的實例而不是數組存儲元素,我們實現以下方法:

1.set(key,value):向字典中添加新元素。

2.remove(key):使用鍵名從字典中移除相應的元素。

3.has(key):如果某個鍵值存在於字典中,返回true,否則返回false。

4.get(key):通過鍵名找到指定的值並返回。

5.clear():清空字典。

6.size():返回字典中元素個數。

7.values():將字典所有值以數組形式返回。

8.getItems():返回items變量,代表字典本身。

1.1 has和set方法

this.has = function(key){
        return key in items;
    },

this.set = function(key,value){
        items[key] = value;
    }

has方法判斷某個鍵值是否在字典中,set方法為字典添加新元素或更新已有元素。

1.2 remove方法

this.remove = function
(key){ if (this.has(key)) { delete items[key]; return true; } return false; }

1.3 get和values方法

this.get = function(key){
        return this.has(key)?items[key]:undefined;
    },

this.values = function(){
        var values = [];
        for(var
k in items){ if (this.hasOwnProperty(k)) { values.push(items[k]); } } return values; }

要註意的是,for...in會遍歷出對象原型上的屬性,所以要this.hasOwnProperty()方法選出對象自身的屬性。

1.4 clear,size和getItems方法

this.clear = function(){
        items = {};
    },

this.size = function(){
        return Object.Keys(items).length;
    },

this.getItems = function(){
        return items;
    }

以下為完整的Map類代碼實現:

function Map() {
    var items = {};
    this.has = function(key){
        return key in items;
    },
    this.set = function(key,value){
        items[key] = value;
    },
    this.remove = function(key){
        if (this.has(key)) {
            delete items[key];
            return true;
        }
        return false;
    },
    this.get = function(key){
        return this.has(key)?items[key]:undefined;
    },
    this.values = function(){
        var values = [];
        for(var k in items){
            if (this.hasOwnProperty(k)) {
                values.push(items[k]);
            }
        }
        return values;
    },
    this.clear = function(){
        items = {};
    },
    this.size = function(){
        return Object.Keys(items).length;
    },
    this.getItems = function(){
        return items;
    }
}

用ES5模擬實現ES6中的Map類