列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合,在这种数据结构上进行的基本操作包括对元素的的查找、插入和删除等。
列表是一组有序的数据,每个列表中的数据项称为元素 。
列表中的元素可以是任意数据类型。
列表中可以保存多少元素并没有事先限定,实际使用时元素的数量受到程序内存的限制。
列表中可以使用一个变量listSize 保存列表中元素的个数, 可以在列表末尾append 一个元素,也可以在一个给定元素后或列表的起始位置insert 一个元素。使用remove方法从列表中删除元素,使用clear 方法清空列表中所有的元素等等。除了这些方法外我们还可以根据自己项目中的业务需要封装其他各种各样的方法。
不像其他语言如python,在JavaScript中是没有列表这个数据结构的,但是数组array和列表非常的相似,所以我们可以根据array封装一个列表类。
1、listSize
列表的元素的个数。
2、pos
列表当前的位置
3、clear
清空列表
4、getCurrentElement
获取当前位置的元素
5、insert
在现有元素后插入新元素
6、append
在列表的末尾添加新元素
7、remove
从列表中删除元素
8、front
将列表的当前位置设移动到第一个元素
9、end
将列表的当前位置移动到最后一个元素
10、prev
将当前位置后移一位
11、next
将当前位置前移一位
12、moveTo
将当前位置移动到指定位置
13、find
在列表中查找指定元素,查找到就返回次元素所在位置,否则返回-1
14、contains
判断一个值是否在列表中
class List {
constructor() {
this.dataStore = [];
this.listSize = 0;
this.pos = 0;
}
// 列表末位添加元素,同时将个数+1
append(element) {
this.dataStore[this.listSize++] = element;
}
// 查找指定元素
find(element) {
for (let index = 0; index < this.dataStore.length; index++) {
if (this.dataStore[index] === element) return index;
}
return -1;
}
// 删除指定元素,同时元素长度 -1
remove(element) {
const elementIndex = this.find(element);
if (elementIndex !== -1) {
this.dataStore.splice(elementIndex, 1);
// eslint-disable-next-line no-plusplus
--this.listSize;
return true;
}
return false;
}
// 向指定元素后插入元素(可多个),同时更新列表个数
insert(targetElement, ...after) {
const elementIndex = this.find(targetElement);
if (elementIndex !== -1) {
this.dataStore.splice(elementIndex + 1, 0, ...after);
this.listSize += after.length;
return true;
}
return false;
}
// 查找当前元素是否在列表中
contains(element) {
for (let index = 0; index < this.dataStore.length; index++) {
if (this.dataStore[index] === element) return true;
}
return false;
}
// 当前位置移到列表第一位
front() {
this.pos = 0;
}
// 当前位置移到列表最后一位
end() {
this.pos = this.listSize - 1;
}
// 当前位置前移一位
prev() {
if (this.pos > 0) --this.pos;
}
// 当前位置后移一位
next() {
if (this.pos < this.listSize - 1) ++this.pos;
}
// 移动到列表指定位置
moveTo(position) {
this.pos = position;
}
// 获取当前位置元素
getCurrentElement() {
return this.dataStore[this.pos];
}
// 清空列表
clear() {
this.dataStore = [];
this.listSize = 0;
this.pos = 0;
}
}
const list = new List();
list.append(0);
list.append(1);
list.append(2);
list.append(3);
list.append(6);
console.log(list.dataStore, list.listSize, '当前值'); // [0, 1, 2, 3, 6] 5 '当前值'
list.insert(3, 4, 5);
console.log(list.dataStore, list.listSize, '插入后的值'); // [0, 1, 2, 3, 4, 5, 6] 7 '插入后的值'
list.next();
list.next();
list.next();
console.log(list.pos, list.getCurrentElement(), '向后移动后的值'); // 3 3 '向后移动后的值'
list.prev();
console.log(list.pos, list.getCurrentElement(), '移动后的值'); // 2 2 '移动后的值'
list.remove(4);
list.remove(5);
console.log(list.dataStore, list.listSize, '删除后的值'); // [0, 1, 2, 3, 6] 5 '-删除后的值'
console.log(list.contains(6), list.contains(5)); // true false
list.clear();
console.log(list.dataStore, list.pos, list.listSize, '清空后的值'); // [] 0 0 '清空后的值'