视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JS做出哈希表功能
2020-11-27 19:49:17 责编:小采
文档
 这次给大家带来JS做出哈希表功能,JS做出哈希表功能的注意事项有哪些,下面就是实战案例,一起来看一下。

在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子。

说明: 这篇文章所写并不是真正意义的哈希表,只是与哈希表的使用有相似之处。

第一部分:相关知识点

属性的枚举:

var person = {
 name: "zzw",
 sex: "Male",
 age: 21
};
for (var prop in person) {
 console.log(prop + " ",person[prop]);
}

输出:

即对于对象而言,我们可以使用for in来枚举对象的属性。

属性的删除:

var person = {
 name: "zzw",
 sex: "Male",
 age: 21
};
var ifRemove = delete person.name;
for (var prop in person) {
 console.log(prop + " ",person[prop]);
}
console.log(ifRemove);

对象的属性可以通过 delete 来删除,并且会有一个返回值。 如下:

注意: 一般只有对象的属性才可以删除,而变量是不能删除的,如:

var x = 1;
console.log(delete x);

这时打印台输出false,因为变量是不可被删除的。

检测属性是否存在:

var person = {
 name: "zzw",
 sex: "Male",
 age: 21
};
console.log("age" in person);
console.log("someOther" in person);

前者返回true,后者返回false。 即我们可以使用in来确定一个对象是否含有该属性。

属性的添加:

var person = {
 name: "zzw",
 sex: "Male",
 age: 21
};
person["school"] = "XJTU";
console.log(person);

属性的添加非常简单,如上所示,最终打印出来的对象是包含 school 属性的。

第二部分: 使用js实现哈希表

下面是通过构造函数得到一个哈希表,在使用时只需实例化即可,且下面的功能较为丰富,在实际问题中,我们可以选择性的使用 。

// 创建构造函数HashTable
function HashTable() {
 // 初始化哈希表的记录条数size
 var size = 0;
 // 创建对象用于接受键值对
 var res = {};
 // 添加关键字,无返回值
 this.add = function (key, value) {
 //判断哈希表中是否存在key,若不存在,则size加1,且赋值
 if (!this.containKey(key)) {
 size++;
 }
 // 如果之前不存在,赋值; 如果之前存在,覆盖。
 res[key] = value;
 };
 // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1
 this.remove = function (key) {
 if (this.containKey(key) && (delete res[key])) {
 size--;
 }
 };
 // 哈希表中是否包含key,返回一个布尔值
 this.containKey = function (key) {
 return (key in res);
 };
 // 哈希表中是否包含value,返回一个布尔值
 this.containValue = function (value) {
 // 遍历对象中的属性值,判断是否和给定value相等
 for (var prop in res) {
 if (res[prop] === value) {
 return true;
 }
 }
 return false;
 };
 // 根据键获取value,如果不存在就返回null
 this.getValue = function (key) {
 return this.containKey(key) ? res[key] : null;
 };
 // 获取哈希表中的所有value, 返回一个数组
 this.getAllValues = function () {
 var values = [];
 for (var prop in res) {
 values.push(res[prop]);
 }
 return values;
 };
 // 根据值获取哈希表中的key,如果不存在就返回null
 this.getKey = function (value) {
 for (var prop in res) {
 if (res[prop] === value) {
 return prop;
 }
 }
 // 遍历结束没有return,就返回null
 return null;
 };
 // 获取哈希表中所有的key,返回一个数组
 this.getAllKeys = function () {
 var keys = [];
 for (var prop in res) {
 keys.push(prop);
 }
 return keys;
 };
 // 获取哈希表中记录的条数,返回一个数值
 this.getSize = function () {
 return size;
 };
 // 清空哈希表,无返回值
 this.clear = function () {
 size = 0;
 res = {};
 };
}

第三部分: 应用实例

问题:给定一个整型的数组(无序),找出其中的两个数使得其和为某个指定的值,并返回这两个数的下标(数组下标从0开始),假设数组元素的值各不相同。

实现如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>哈希表的使用</title>
</head>
<body>
 <script>
 function queryIndex(arr, result) {
 var hashTable = new HashTable();
 var arrLength = arr.length;
 var sub = [];
 for (var i = 0; i < arrLength; i++) {
 // 扫描一遍,存储下标和值
 hashTable.add(i, arr[i]);
 }
 for (var j = 0; j < arrLength; j++) {
 if (hashTable.containValue(result - arr[j]) && result !== 2*arr[j]) {
 // 获取两个下标,跳出循环
 sub.push(j);
 var antherIndex = Number(hashTable.getKey(result - arr[j]));
 sub.push(antherIndex);
 break;
 }
 }
 if (sub.length !== 0) {
 return sub;
 } else {
 return -1;
 }
 }
 console.log(queryIndex([1,5,7,3,8], 15)); // 2, 4
 console.log(queryIndex([8,18,28,12,29,17], 46)); // 2, 4
 console.log(queryIndex([8,18,28,12,29,17], 2)); // -1
 // 创建构造函数HashTable
 function HashTable() {
 // 初始化哈希表的记录条数size
 var size = 0;
 // 创建对象用于接受键值对
 var res = {};
 // 添加关键字,无返回值
 this.add = function (key, value) {
 //判断哈希表中是否存在key,若不存在,则size加1,且赋值
 if (!this.containKey(key)) {
 size++;
 }
 // 如果之前不存在,赋值; 如果之前存在,覆盖。
 res[key] = value;
 };
 // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1
 this.remove = function (key) {
 if (this.containKey(key) && (delete res[key])) {
 size--;
 }
 };
 // 哈希表中是否包含key,返回一个布尔值
 this.containKey = function (key) {
 return (key in res);
 };
 // 哈希表中是否包含value,返回一个布尔值
 this.containValue = function (value) {
 // 遍历对象中的属性值,判断是否和给定value相等
 for (var prop in res) {
 if (res[prop] === value) {
 return true;
 }
 }
 return false;
 };
 // 根据键获取value,如果不存在就返回null
 this.getValue = function (key) {
 return this.containKey(key) ? res[key] : null;
 };
 // 获取哈希表中的所有value, 返回一个数组
 this.getAllValues = function () {
 var values = [];
 for (var prop in res) {
 values.push(res[prop]);
 }
 return values;
 };
 // 根据值获取哈希表中的key,如果不存在就返回null
 this.getKey = function (value) {
 for (var prop in res) {
 if (res[prop] === value) {
 return prop;
 }
 }
 // 遍历结束没有return,就返回null
 return null;
 };
 // 获取哈希表中所有的key,返回一个数组
 this.getAllKeys = function () {
 var keys = [];
 for (var prop in res) {
 keys.push(prop);
 }
 return keys;
 };
 // 获取哈希表中记录的条数,返回一个数值
 this.getSize = function () {
 return size;
 };
 // 清空哈希表,无返回值
 this.clear = function () {
 size = 0;
 res = {};
 };
 }
 </script>
</body>
</html>

在实际的使用过程中,我们可以先写出主要的功能,然后有需要再添加。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

JS+CSS3实现鼠标与图片互动放大效果

根据jQuery.i18n实现web前端国际化

下载本文
显示全文
专题