js实现存储对象的数据结构hashTable和list

以下代码是typescript语言来写的,其实和es6面向对象的写法基本一致。大家阅读后都明白这些方法的作用。

hash

hash结构用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。

实现该数据结构的几个方法:

函数名 说明 返回值
set(key,value) 添加项
del(key) 根据key删除一项
has(key) 是否包含某个key bool
get(key) 根据key值获取value value
first() 获取第一个value value
last() 获取最后一个value value
count() 获取项总数 int
all() 返回所有值的数组 array
getByIndex(index) 根据在数组中的index顺序获取value value
foreach(callback) 遍历所有值
indexOf(key) 根据key值获取在数组中的顺序值 index,int
insertAt(index,value,key) 在指定index位置插入key,value
  1   export class HashTable<T> {
  2         private items: { [key: string]: HashValue<T> };
  3         @SerializeProperty({ list: true, type: Array })
  4         private itemList: Array<T>;
  5         constructor() {
  6             super();
  7             this.items = {};
  8             this.itemList = [];
  9         }
 10
 11         set(key: string, value: T): void {
 12             var vl = new HashValue<T>();
 13             vl.key = key;
 14             vl.value = value;
 15             var index = this.itemList.length;
 16             if (this.has(key)) {
 17                 index = this.items[key].index;
 18             }
 19             vl.index = index;
 20             this.itemList[index] = value;
 21             this.items[key] = vl;
 22         }
 23
 24         del(key: string): void {
 25             if (this.has(key)) {
 26                 var index = this.items[key].index;
 27                 if (index > -1) {
 28                     this.itemList.splice(index, 1);
 29                 }
 30                 delete this.items[key];
 31                 this.resetIndex();
 32             }
 33         }
 34
 35         resetIndex(): void {
 36
 37             this.foreach((k, v: T) => {
 38                 var index = this.itemList.indexOf(v);
 39                 this.items[k].index = index;
 40             });
 41         }
 42
 43         has(key: string): boolean {
 44             return key in this.items;
 45         }
 46
 47         get(key: string): T {
 48             if (this.has(key)) {
 49                 return this.items[key].value;
 50             }
 51             return null;
 52         }
 53
 54         count(): number {
 55             return this.itemList.length;
 56         }
 57
 58         all(): Array<T> {
 59             return this.itemList;
 60         }
 61
 62         first() {
 63             return this.itemList[0];
 64         }
 65
 66         last() {
 67             return this.itemList[this.itemList.length - 1];
 68         }
 69
 70         getByIndex(index: number): T {
 71             return this.itemList[index];
 72         }
 73
 74         //遍历 扩展
 75         foreach(callback) {
 76             for (var key in this.items) {
 77                 callback(key, this.items[key].value);
 78             }
 79         }
 80
 81         //获取index
 82         indexOf(key) {
 83             if (this.has(key)) {
 84                 return this.items[key].index;
 85             }
 86         }
 87
 88         //插入
 89         insertAt(index: number, value: T, key: string) {
 90             this.itemList.splice(index, 0, value);
 91             var hashV = new HashValue<T>();
 92             hashV.index = index;
 93             hashV.key = key;
 94             hashV.value = value;
 95             this.items[key] = hashV;
 96             this.resetIndex();
 97         }
 98
 99         sort(callback: Function) {
100             this.itemList.sort((a: T, b: T) => { return callback(a, b);
101           });
102         }
103     }

List

js实现链表List数据结构的几个方法:

函数名 说明 返回值
add(value) 添加项
addList(list) 添加另一个集合
pop() 删除最后一项 并返回该项 value
shift() 删除第一项 并返回该项 value
remove(index) 根据索引值删除某一项
removeMany(index,count) 删除从指定位置开始的某几项
clear() 删除所有项
contains(value) 是否包含某个值 boolean
indexOf(value) 根据值获取在数组中的顺序值 int
get(index) 根据index获取value value
set(index,value) 设置index位置的value
length() 获取项总数 int
all() 返回所有值的数组 array
foreach(callback) 遍历所有值
reverseForeach(callback) 倒序遍历所有值
sort(callback) 根据某个排序规则进行排序
insert(index,value) 在指定index位置插入value

 1  export class List<T> {
 2         private items: Array<T>;
 3
 4         private checkIndex(index): boolean {
 5             return !(index < 0 || isNaN(index) || index >= this.items.length);
 6         }
 7         constructor() {
 8             super();
 9             this.items = new Array<T>();
10         }
11
12         length(): number {
13             return this.items.length;
14         }
15
16         add(value: T): void {
17             this.items.push(value);
18         }
19         addList(valueList: List<T>) {
20             for (var i = 0; i < valueList.length(); i++) {
21
22                 var value = valueList.get(i);
23                 this.items.push(value);
24             }
25         }
26         pop(): T {
27             return this.items.pop();
28         }
29
30         shift() {
31             this.items.shift();
32         }
33
34         remove(index: number): void {
35             if (this.checkIndex(index)) {
36               this.items.splice(index,1);
37
38             }
39         }
40         /**
41          * 從指定索引處開始刪除指定個數的元素
42          * @param from
43          * @param count
44          */
45         removeMany(from: number, count: number) {
46
47             if (this.checkIndex(from)) {
48                 this.items.splice(from, count);
49             }
50         }
51
52         clear(): void {
53             this.items = [];
54         }
55
56         contains(value: T): boolean {
57             for (var i in this.items) {
58                 return value == this.items[i];
59             }
60             return false;
61         }
62
63         indexOf(value: T): number {
64             return this.items.indexOf(value);
65         }
66
67         insert(index: number, value: T) {
68             //this.checkIndex(index) && this.items.splice(index , 0, value);
69             this.items.splice(index, 0, value);
70         }
71
72         get(index: number): T {
73             return this.items[index];
74         }
75         set(index, value: T) {
76             this.items[index] = value;
77         }
78         all(): Array<T> {
79             return this.items;
80         }
81         foreach(callback:(i:number,item:T)=>any) {
82             var len = this.items.length;
83             for (var i = 0; i < len; i++) {
84                 if (callback(i, this.items[i]) === false) break;
85             }
86         }
87         reverseForeach(callback) {
88             var len = this.items.length;
89             for (var i = len - 1; i >= 0; i--) {
90                 if (callback(i, this.items[i]) === false) break;
91             }
92         }
93         sort(callback: Function) {
94             this.items.sort((a: T, b: T) => { return callback(a, b); });
95         }
96     }
时间: 2024-10-09 01:09:41

js实现存储对象的数据结构hashTable和list的相关文章

在数据结构中存储对象

数组列表 在java.util包中有一个类可以实现数组所有的功能,而且没有数组的大小限制,它就是ArrayList. 数组列表是一个存储同一类对象或具有共同超类的对象的数据结构.在程序运行时,列表可以根据需要调整大小. 创建数组列表是最简单的方法是调用其不带参数的构造函数. ArrayList servants = new ArrayList(); 在创建数组列表时,可以指定一个初始的容量(大小),这为列表能存放多少个元素提供了指导.该容量作为一个整型参数传递给构造函数 ArrayList se

JS内置对象-String对象、Date日期对象、Array数组对象、Math对象

一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义对象,然后创建新的对象实例 二.JS内置对象-String 1.string对象 string对象用于处理已有的字符串 字符串可以使用单引号或者双引号 2.indexOf( )  在字符串中查找字符串,如果匹配成功返回首字母所在的位置,否则返回-1 3.match() 匹配成功,返回匹配成功的数组,

JS中的对象和方法简单剖析

众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): Dates ,Maths,Regexps,Arrays,Funcitons,当然Objects,这些都是对象: JS中,所有值,除了原生值,都是对象:这些原生值包括:strings,numbers('3.14'),true,false,null和undefined 对象是包含变量的变量,js变量可

js的常用对象和方法

1.上节课内容回顾  * html里面form表单     * css     * javascript 2.内容补充  1.js和html两种结合方式   * 使用外部文件方式   * <script type="text/javascript" src="1.js">不能写js代码</script>    2.padding:内边距   * padding: 20px;   * 另外一种设置方式:   /*    设置内边距    按照顺

js Web存储方式

JSON是数据交互中最常用的一种数据格式. 由于各种语言的语法都不同,在传递数据时,可以将自己语言中的数组.对象等转换为JSON字符串> 传递之后,可以讲JSON字符串,在解析为JSON对象. JSON 对象的用法与js中的对象基本相同,唯一需要区别的是,JSON中的键,必须是字符串. JSON 名称/值对 JSON 数据的书写格式是:名称/值对. eg:   "name" : "1111" JSON 值 JSON 值可以是: ● 数字(整数或浮点数) ● 字

5月15日上课笔记-js中 location对象的属性、document对象、js内置对象、Date事件对象、

location的属性: host: 返回当前主机名和端口号 定时函数: setTimeout( ) setInterval() 二.document对象 getElementById(); 根据ID值获取一个DOM对象 getElementsByName(); 根据name属性值获取多个Dom对象 getElementsByTagName(); 根据标签获取多个DOM对象 获取标签体内容 innerHTML 获取input的value值 value 获取下拉框选中的值 value this 代

存储对象可以考虑:1,数组,2,集合

/* * 1,存储对象可以考虑:1,数组,2,集合 * 2,数组存储对象的特点: *   Student[]stu = new Student[20]; *   stu[0] = new Student(); *  不足:一旦创建,其长度不可变: *   真实的数组存放的对象的个数是不可知的. * 3,集合 *   Collection接口 *     List接口:存储有序的,可以重复的元素 *       ArrayList(主要的实现类,首选),LinkList(对于频繁的删除和插入操作)

Node.js:全局对象

概要:本篇博客主要介绍了node.js中的全局对象. 在JavaScript中,通常window是全局对象,而node.js中的全局对象是global,所有全局变量(除了global本身之外)都是global对象的属性.如:console.process. 1.全局对象与全局变量 global最根本的作用是作为全局变量的宿主.满足以下条件: ●在最外层定义的变量: ● 全局对象的属性: ● 隐式定义的变量(未定义直接赋值的变量). 2.process process是一个全局变量,即global

深入了解Redis【二】对象及数据结构综述

引言 Redis中每个键值对都是由对象组成: 键总是一个字符串对象(string) 值可以是字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(zset). 介绍 redis官方网站中对其数据类型的简单介绍: An introduction to Redis data types and abstractions 摘抄一段关于redis key的介绍: Redis keys Redis keys are binary safe, this m