首页 > 代码库 > 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数据结构-列表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。