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()方法不判断边界,只负责移动下标。

 

 

posted @ 2016-08-18 22:09  nd  阅读(1022)  评论(0编辑  收藏  举报