javascript中的表結構
列表是一種常見的數據結構,通常列表是一族有徐的數據,列表中的數據項稱為元素。在javascript中列表中的數據可以是任意類型的,列表中可以保存多少元素沒有事先限定,實際使用時元素的數量只收到程序內內存的限制。
不包含任何元素的列表稱為空列表,列表中包含元素的個數稱為列表的length,在內部實現上,用一個變量listSize保存列表中元素的個數。可以在列表末尾append一個元素,也可以在一個給定元素后面insert一個元素,使用remove方法從列表中刪除元素,使用clear方法清空列表中素有的元素。
列表有前后,分別對應front和end,使用getElement()方法顯示當前元素,列表擁有描述元素位置的屬性,使用next()方法可以從當前元素移動到下一個元素,使用prev()方法可以移動到當前元素的前一個元素,還可以使用moveTo(n)方法直接移動到指定的位置,這里n標識要移動到第n個位置,currPos屬性標識列表中的當前位置。
| listSize(屬性) | 列表的元素個數 |
| pos( 屬性) | 列表的當前位置 |
| length( 屬性) | 返回列表中元素的個數 |
| clear( 方法) | 清空列表中的所有元素 |
| toString( 方法) | 返回列表的字符串形式 |
| getElement( 方法) | 返回當前位置的元素 |
| insert( 方法) | 在現有元素后插入新元素 |
| append( 方法) | 在列表的末尾添加新元素 |
| remove( 方法) | 從列表中刪除元素 |
| front( 方法) | 將列表的當前位置設移動到第一個元素 |
| end( 方法) | 將列表的當前位置移動到最后一個元素 |
| prev(方法) | 將當前位置后移一位 |
| next( 方法) | 將當前位置前移一位 |
| currPos( 方法) | 返回列表的當前位置 |
| moveTo(方法) | 將當前位置移動到指定位置 |
下面我們看看代碼實現
function List() { this.listSize = 0; this.pos = 0; this.dataStore = []; //初始化一個空數組來保存列表元素 this.clear = clear; this.find = find; this.toString = toString; this.insert = insert; this.append = append; this.remove = remove; this.front = front; this.end = end; this.prev = prev; this.next = next; this.length = length; this.currPos = currPos; this.moveTo = moveTo; this.getElement = getElement; this.contains = contains; //給列表添加元素,給列表的下一個位置增加一個新的元素,這個位置剛好等于listSize的值 function append(element) { this.dataStore[this.listSize++] = element; } //在列表中查找一個元素,對數組對象dataStore迭代,查找給定的元素,如果找到就返回鈣元素在列表中的位置 function find(element) { for(var i = 0; i < this.dataSource.length; ++i) { if(this.dataSource[i] == element) { return i; } return -1; } } //從列表中刪除元素,先在列表中找到該元素,然后刪除它,并且調整底層的數據對象以填補鈣元素留下的空白,slice()方法簡化這個過程 function remove(elemment) { var foundAt = this.find(elemment); if(foundAt > -1) { this.dataSource.splice(foundAt, 1); --this.listSize; return true; } return false; } //返回列表中的元素個數 function length(){ return this.listSize; } function toString(){ return this.dataStore; } //插入元素,先找到要插入的位置,然后插入一個元素listSize自增 function insert(element, after){ var insertPos = this.find(after); if(insertPos > -1){ this.dataStore.splice(insertPos + 1, 0, element); ++this.listSize; return true; } return false; } //清空列表中所有元素,指針指向第一個 function clear(){ delete this.dataStore; this.dataStore = []; this.listSize = this.pos = 0; } //判斷給定值是否在列表中 function contains(element){ for (var i=0; i<this.dataStore.length; ++i) { if(this.dataStore[i] == element){ return true; } } return false; } //回到第0個 function front(){ this.pos = 0; } //到最后一個 function end(){ this.pos = this.listSize - 1; } //上一個,注意這里不判斷邊界 function prev(){ --this.pos; } //下一個,注意這里不判斷邊界 function next(){ ++this.pos; } //當前指針 function currPos(){ return this.pos; } //定位到位置 function moveTo(position){ // if( position>-1 && position<this.listSize ){ this.pos = position; // } } //返回當前元素 function getElement(){ return this.dataStore[this.pos]; } } var names = new List(); names.append('Clayton'); names.append('Raymond'); names.append('Cynthia'); names.append('Jennifer'); names.append('Bryan'); names.append('Danny'); for(names.front(); names.currPos() < names.length(); names.next()) { document.writeln(names.getElement()); } for(names.end(); names.currPos() >= 0; names.prev()) { document.writeln(names.getElement()); }
最后的輸出結果如下:

注意next()方法和prev()方法不判斷邊界,只負責移動下標。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號