首页 > 代码库 > JavaScript数据结构-列表

JavaScript数据结构-列表

当不需要在一个很长的序列中查找元素,或者对其进行排序,可以使用列表。如果数据结构非常复杂,就使用别的数据结构。

一个简单列表的例子:

  1 /**  2  * 一个简单的列表  3  * @constructor  4  */  5 var List = function () {  6     this.listSize = 0;  7     this.pos = 0;  8     this.dataSource = [];//初始化一个数组来保存列表元素  9 }; 10 List.prototype = (function () { 11     return { 12         clear: clear, 13         find: find, 14         toString: toString, 15         insert: insert, 16         append: append, 17         remove: remove, 18         front: front, 19         end: end, 20         prev: prev, 21         next: next, 22         hasNext: hasNext, 23         hasPrev: hasPrev, 24         length: length, 25         currPos: currPos, 26         moveTo: moveTo, 27         getElement: getElement 28     }; 29     /** 30      * 给列表最后添加元素的时候,列表元素个数+1 31      * @param element 32      */ 33     function append(element) { 34         this.listSize++; 35         this.dataSource.push(element); 36     } 37  38     /** 39      * @param element 如果传入的是对象,需要判断是否是对象以及两个对象是否相等 40      * @returns {number} 如果找到,返回位置,否则-1 41      */ 42     function find(element) { 43         for (var i = 0; i < this.dataSource.length; i++) { 44             if (this.dataSource[i] === element) { 45                 return i; 46             } 47         } 48         return -1; 49     } 50  51     /** 52      * 返回列表元素的个数 53      * @returns {number} 54      */ 55     function length() { 56         return this.listSize; 57     } 58  59     /** 60      * 删除元素成功,元素个数-1 61      * @param element 62      * @returns {boolean} 63      */ 64     function remove(element) { 65         var removeIndex = this.find(element); 66         if (removeIndex !== -1) { 67             this.dataSource.splice(removeIndex, 1); 68             this.listSize--; 69             return true; 70         } 71         return false; 72     } 73  74     /** 75      * 返回要展示的列表 76      * @returns {string} 77      */ 78     function toString() { 79         return this.dataSource.toString(); 80     } 81  82     /** 83      * 插入某个元素 84      * @param element 要插入的元素 85      * @param afterElement 列表中的元素之后 86      * @returns {boolean} 87      */ 88     function insert(element, afterElement) { 89         var insertIndex = this.find(afterElement); 90         if (insertIndex !== -1) { 91             this.dataSource.splice(insertIndex + 1, 0, element); 92             this.listSize++; 93             return true; 94         } 95         return false; 96     } 97  98     /** 99      * 清空列表中的所有元素100      */101     function clear() {102         delete this.dataSource;103         this.dataSource = [];104         this.listSize = this.pos = 0;105     }106 107     /**108      * 将列表的当前位置移动到第一个元素109      */110     function front() {111         this.pos = 0;112     }113 114     /**115      * 将列表的当前位置移动到最后一个元素116      */117     function end() {118         this.pos = this.listSize - 1;119     }120 121     /**122      * 返回当前位置的元素123      * @returns {*}124      */125     function getElement() {126         return this.dataSource[this.pos];127     }128 129     /**130      * 将当前位置向前移动一位131      */132     function prev() {133         --this.pos;134     }135 136     /**137      * 将当前位置向后移动一位138      */139     function next() {140         ++this.pos;141     }142 143     /**144      * 返回列表的当前位置145      * @returns {number|*}146      */147     function currPos() {148         return this.pos;149     }150 151     /**152      * 移动到指定位置153      * @param position154      */155     function moveTo(position) {156         this.pos = position;157     }158 159     /**160      * 判断是否有后一位161      * @returns {boolean}162      */163     function hasNext() {164         return this.pos < this.listSize;165     }166 167     /**168      * 判断是否有前一位169      * @returns {boolean}170      */171     function hasPrev() {172         return this.pos >= 0;173     }174 }());

下面是一个基于列表的简单应用:

假设有20部影碟,属于一个TXT文件:技术分享

我用nodejs来读取文件内容:

 1 var fs = require(‘fs‘); 2 var movies = createMovies(‘films.txt‘); 3 /** 4  * 读取数据,返回数组 5  * @param file 6  * @returns {Array|*} 7  */ 8 function createMovies(file) { 9     var arr = fs.readFileSync(file, ‘utf-8‘).split("\n");10     for (var i = 0; i < arr.length; i++) {11         arr[i] = arr[i].trim();12     }13     return arr;14 }

然后初始化影碟列表

1 var movieList = new List();2 for (var i = 0; i < movies.length; i++) {3     movieList.append(movies[i]);4 }

然后定义用户列表和用户前来拿影碟行为

 1 var customers = new List(); 2 /** 3  * 用户对象 4  * @param name 用户姓名 5  * @param movie 用户拿走的影碟 6  * @constructor 7  */ 8 var Customer = function (name, movie) { 9     this.name = name;10     this.movie = movie;11 };12 /**13  * 用户拿走影碟14  * @param name 用户的名字15  * @param movie 影碟的名字16  * @param movieList 所有影碟列表17  * @param customerList 用户列表18  */19 function checkOut(name, movie, movieList, customerList) {20     if (movieList.find(movie) !== -1) {21         var user = new Customer(name, movie);22         customerList.append(user);//用户拿掉影碟,讲用户加入customerList23         movieList.remove(movie);//从movieList中删除掉被拿掉的影碟24     } else {25         console.log(‘没有该电影‘);26     }27 }

一切就绪之后测试一下之前的代码

 1 var fs = require(‘fs‘); 2 var movies = createMovies(‘films.txt‘); 3 var movieList = new List(); 4 var customers = new List(); 5 for (var i = 0; i < movies.length; i++) { 6     movieList.append(movies[i]); 7 } 8 checkOut(‘Jane‘, ‘肖申克的救赎‘, movieList, customers); 9 displayList(customers);10 console.log(‘分割线-----------------‘);11 displayList(movieList);

结果:

Jane,肖申克的救赎分割线-----------------教父教父2低俗小说黄金三镖客十二怒汉辛德勒名单黑暗骑士指环王:王者归来搏击俱乐部星球大战5:帝国反击战飞越疯人院指环王:护戒使者盗梦空间好家伙星球大战七武士黑客帝国阿甘正传上帝之城

总结:列表是一种自然的数据组织方式。如果数据存储的顺序不重要,列表是一种非常好的数据结构。

JavaScript数据结构-列表