列表是一组有序的数据,每个列表中的数据项称为元素。在 JavaScript 中,列表中的元素 可以是任意数据类型。列表中可以保存多少元素并没有事先限定,实际使用时元素的数量 受到程序内存的限制。
当不需要在一个很 长的序列中查找元素,或者对其进行排序时,列表显得尤为有用。反之,如果数据结构非 常复杂,列表的作用就没有那么大了。
属性/方法 | 描述 |
---|---|
listSize(属性) | 列表的元素个数 |
pos(属性) | 列表的当前位置 |
length(属性) | 返回列表中元素的个数 |
clear(方法) | 清空列表中的所有元素 |
toString(方法) | 返回列表的字符串形式 |
getElement(方法) | 返回当前位置的元素 |
insert(方法) | 在现有元素后插入新元素 |
append(方法) | 在列表的末尾添加新元素 |
remove(方法) | 从列表中删除元素 |
front(方法) | 将列表的当前位置设移动到第一个元素 |
end(方法) | 将列表的当前位置移动到最后一个元素 |
prev(方法) | 将当前位置后移一位 |
next(方法) | 将当前位置前移一位 |
currPos(方法) | 返回列表的当前位置 |
moveTo(方法) | 将当前位置移动到指定位置 |
根据以上定义的方法,实现自己的列表类,定义一个基本类 List,基本代码如下:
class List {
constructor() {
this.listSize = 0
this.pos = 0
this.dataStore = []
}
}
定义添加元素的append
方法,该方法给列表的下一个位置增加一个新的元素,这 个位置刚好等于变量 listSize 的值,片段代码如下:
// 给列表增加元素
append(elm) {
this.dataStore[this.listSize++] = elm
}
定义查找元素位置的find
方法,返回值为元素的位置,如果不存在则返回-1,片段代码如下:
// 从列表查找某一元素
find(elm) {
for (let v of Object.keys(this.dataStore)) {
if (elm === this.dataStore[v]) {
return Number(v)
}
}
return -1
}
定义删除remove
方法,先根据上面定义的find
方法找出元素的位置,然后通过 splice 来删除,片段代码如下:
// 从列表中删除元素
remove(elm) {
let foundAt = this.find(elm)
if (foundAt > -1) {
this.dataStore.splice(foundAt, 1)
--this.listSize
return true
}
return false
}
定义列表计算多少个元素length
方法以及显示列表中的元素toString
方法,片段代码如下:
// 列表中有多少个元素
length() {
return this.listSize
}
// 显示列表中的元素
toString() {
return this.dataStore
}
定义向列表插入一个元素的insert
方法,主要也是先通过find
方法找到元素位置,然后根据 splice 来插入元素,片段代码如下:
// 向列表中插入一个元素
insert(elm, after) {
var insertPos = this.find(after)
if (insertPos > -1) {
this.dataStore.splice(insertPos + 1, 0, elm)
++this.listSize
return true
}
return false
}
定义清空列表的clear
方法,主要将初始化定义的变量全部清空,片段代码如下:
// 清空列表中所有的元素
clear() {
this.dataStore = []
this.listSize = this.pos = 0
}
判断给定值是否在列表中,通过定义contains
方法来区分,片段代码如下:
// 判断给定值是否在列表中
contains(elm) {
for (let v of Object.keys(this.dataStore)) {
if (elm === this.dataStore[v]) {
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
}
}
// 返回列表的当前位置
currPos() {
return this.pos
}
// 将当前位置移动到指定位置
moveTo(position) {
this.pos = position
}
// 返回当前位置的元素
getElement() {
return this.dataStore[this.pos]
}
以下是具体使用代码:
// 示例如下
let names = new List()
names.append('Clayton')
names.append('Raymond')
names.append('Cynthia')
names.append('Jennifer')
names.append('Bryan')
names.append('Danny')
names.length() // 6
names.toString() // ["Clayton", "Raymond", "Cynthia", "Jennifer", "Bryan", "Danny"]
names.contains('wq') // false
names.getElement() // Clayton
names.next()
names.getElement() // Raymond
完整代码如下:
class List {
constructor() {
this.listSize = 0
this.pos = 0
this.dataStore = []
}
// 给列表增加元素
append(elm) {
this.dataStore[this.listSize++] = elm
}
// 从列表查找某一元素
find(elm) {
for (let v of Object.keys(this.dataStore)) {
if (elm === this.dataStore[v]) {
return Number(v)
}
}
return -1
}
// 从列表中删除元素
remove(elm) {
let foundAt = this.find(elm)
if (foundAt > -1) {
this.dataStore.splice(foundAt, 1)
--this.listSize
return true
}
return false
}
// 列表中有多少个元素
length() {
return this.listSize
}
// 显示列表中的元素
toString() {
return this.dataStore
}
// 向列表中插入一个元素
insert(elm, after) {
var insertPos = this.find(after)
if (insertPos > -1) {
this.dataStore.splice(insertPos + 1, 0, elm)
++this.listSize
return true
}
return false
}
// 清空列表中所有的元素
clear() {
this.dataStore = []
this.listSize = this.pos = 0
}
// 判断给定值是否在列表中
contains(elm) {
for (let v of Object.keys(this.dataStore)) {
if (elm === this.dataStore[v]) {
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
}
}
// 返回列表的当前位置
currPos() {
return this.pos
}
// 将当前位置移动到指定位置
moveTo(position) {
this.pos = position
}
// 返回当前位置的元素
getElement() {
return this.dataStore[this.pos]
}
}