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; 改進
這段代碼還是有改進的空間的,就是還可以添加一些其他的便捷方法,不過我就先實現到這里,后續的改進我會更新這段代碼。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!