JavaScript實現的List(集合)類

引言

在後端語言(如C#、Java)中,通常具備List類型,它是一種集合類型,能夠放置某個類型的數據;它與數組(Array)相似,可是相對於數組,它又會有不少更加便捷的API,如:add、remove、clear等方法;後端

JavaScript中是沒有原生的支持List類型的,因此你們在想要使用的時候,都會去本身封裝一個類,而後去實現它,下面我也給出一種實現方式,這個實現知足了基本的API,並且是在JS Array類型的基礎上擴展的,也能夠在它上面使用Array的方法,另一大 亮點 是能夠直接引用length屬性得到集合的元素個數。數組

代碼實現

//兼容IE8-,爲Array原型添加indexOf方法;
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (item) {
        var index = -1;
        for (var i = 0; i < this.length; i++) {
            if (this[i] === item) {
                index = i;
                break;
            }
        }
        return index;
    }
}

//List類實現
var List = function (args) {
    var self = this;

    if (List.isArray(args)) {
        self = args;
    }
    self.constructor = List;
    //向集合追加新元素
    self.add = function (item) {
        self.push(item);
        return self;
    };
    //在指定索引處插入新元素
    self.insert = function (index, item) {
        self.splice(index, 0, item);
        return self;
    };
    //刪除元素,僅刪除第一個索引處的元素
    self.remove = function (item) {
        var index = self.indexOf(item);
        if (index != -1) {
            return self.splice(index, 1)[0];
        } else {
            return undefined;
        }
    };
    //刪除元素,若是元素在多個索引處存在,則所有刪除
    self.removeAll = function (item) {
        var result = [];
        var removeItem = undefined;
        do {
            removeItem = self.remove(item);
            if (removeItem !== undefined) {
                result.push(removeItem);
            }
        } while (removeItem !== undefined);
        return result;
    };
    //根據index刪除元素
    self.removeAt = function (index) {
        if (index != -1) {
            return self.splice(index, 1)[0];
        } else {
            return undefined;
        }
    };
    //判斷元素是否包含在集合中
    self.contains = function (item) {
        return self.indexOf(item) != -1;
    };
    //清空集合的全部元素
    self.clear = function () {
        return new List(self.splice(0, self.length));
    };
    self.size = function () {
        return self.length;
    };

    if (List.isArray(args)) {
        return self;
    } else if (arguments.length > 0) {
        for (var i = 0; i < arguments.length; i++) {
            self.add(arguments[i]);
        }
    }
};
List.isArray = Array.isArray || function (target) {
    return Object.prototype.toString.call(target) === "[object Array]";
};

/*下面這段代碼是關鍵,它設定了List類的原型是Array的原型(繼承關係),因此List類也一樣擁有Array的特徵*/
List.prototype = Array.prototype;

改進

這段代碼仍是有改進的空間的,就是還能夠添加一些其餘的便捷方法,不過我就先實現到這裏,後續的改進我會更新這段代碼。this

相關文章
相關標籤/搜索