javascript中的表结构

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

 

 

转载于:https://www.cnblogs.com/tylerdonet/p/5785552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值