当前位置:Gxlcms > JavaScript > 如何使用JS模拟实现哈希表

如何使用JS模拟实现哈希表

时间:2021-07-01 10:21:17 帮助过:24人阅读

这次给大家带来如何使用JS模拟实现哈希表,使用JS模拟实现哈希表的注意事项有哪些,下面就是实战案例,一起来看一下。

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

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

第一部分:相关知识点

属性的枚举:

  1. var person = {
  2. name: "zzw",
  3. sex: "Male",
  4. age: 21
  5. };
  6. for (var prop in person) {
  7. console.log(prop + " ",person[prop]);
  8. }

输出:

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

属性的删除:

  1. var person = {
  2. name: "zzw",
  3. sex: "Male",
  4. age: 21
  5. };
  6. var ifRemove = delete person.name;
  7. for (var prop in person) {
  8. console.log(prop + " ",person[prop]);
  9. }
  10. console.log(ifRemove);

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

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

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

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

检测属性是否存在:

  1. var person = {
  2. name: "zzw",
  3. sex: "Male",
  4. age: 21
  5. };
  6. console.log("age" in person);
  7. console.log("someOther" in person);

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

属性的添加:

  1. var person = {
  2. name: "zzw",
  3. sex: "Male",
  4. age: 21
  5. };
  6. person["school"] = "XJTU";
  7. console.log(person);

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

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

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

  1. // 创建构造函数HashTable
  2. function HashTable() {
  3. // 初始化哈希表的记录条数size
  4. var size = 0;
  5. // 创建对象用于接受键值对
  6. var res = {};
  7. // 添加关键字,无返回值
  8. this.add = function (key, value) {
  9. //判断哈希表中是否存在key,若不存在,则size加1,且赋值
  10. if (!this.containKey(key)) {
  11. size++;
  12. }
  13. // 如果之前不存在,赋值; 如果之前存在,覆盖。
  14. res[key] = value;
  15. };
  16. // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1
  17. this.remove = function (key) {
  18. if (this.containKey(key) && (delete res[key])) {
  19. size--;
  20. }
  21. };
  22. // 哈希表中是否包含key,返回一个布尔值
  23. this.containKey = function (key) {
  24. return (key in res);
  25. };
  26. // 哈希表中是否包含value,返回一个布尔值
  27. this.containValue = function (value) {
  28. // 遍历对象中的属性值,判断是否和给定value相等
  29. for (var prop in res) {
  30. if (res[prop] === value) {
  31. return true;
  32. }
  33. }
  34. return false;
  35. };
  36. // 根据键获取value,如果不存在就返回null
  37. this.getValue = function (key) {
  38. return this.containKey(key) ? res[key] : null;
  39. };
  40. // 获取哈希表中的所有value, 返回一个数组
  41. this.getAllValues = function () {
  42. var values = [];
  43. for (var prop in res) {
  44. values.push(res[prop]);
  45. }
  46. return values;
  47. };
  48. // 根据值获取哈希表中的key,如果不存在就返回null
  49. this.getKey = function (value) {
  50. for (var prop in res) {
  51. if (res[prop] === value) {
  52. return prop;
  53. }
  54. }
  55. // 遍历结束没有return,就返回null
  56. return null;
  57. };
  58. // 获取哈希表中所有的key,返回一个数组
  59. this.getAllKeys = function () {
  60. var keys = [];
  61. for (var prop in res) {
  62. keys.push(prop);
  63. }
  64. return keys;
  65. };
  66. // 获取哈希表中记录的条数,返回一个数值
  67. this.getSize = function () {
  68. return size;
  69. };
  70. // 清空哈希表,无返回值
  71. this.clear = function () {
  72. size = 0;
  73. res = {};
  74. };
  75. }

第三部分: 应用实例

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

实现如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>哈希表的使用</title>
  6. </head>
  7. <body>
  8. <script>
  9. function queryIndex(arr, result) {
  10. var hashTable = new HashTable();
  11. var arrLength = arr.length;
  12. var sub = [];
  13. for (var i = 0; i < arrLength; i++) {
  14. // 扫描一遍,存储下标和值
  15. hashTable.add(i, arr[i]);
  16. }
  17. for (var j = 0; j < arrLength; j++) {
  18. if (hashTable.containValue(result - arr[j]) && result !== 2*arr[j]) {
  19. // 获取两个下标,跳出循环
  20. sub.push(j);
  21. var antherIndex = Number(hashTable.getKey(result - arr[j]));
  22. sub.push(antherIndex);
  23. break;
  24. }
  25. }
  26. if (sub.length !== 0) {
  27. return sub;
  28. } else {
  29. return -1;
  30. }
  31. }
  32. console.log(queryIndex([1,5,7,3,8], 15)); // 2, 4
  33. console.log(queryIndex([8,18,28,12,29,17], 46)); // 2, 4
  34. console.log(queryIndex([8,18,28,12,29,17], 2)); // -1
  35. // 创建构造函数HashTable
  36. function HashTable() {
  37. // 初始化哈希表的记录条数size
  38. var size = 0;
  39. // 创建对象用于接受键值对
  40. var res = {};
  41. // 添加关键字,无返回值
  42. this.add = function (key, value) {
  43. //判断哈希表中是否存在key,若不存在,则size加1,且赋值
  44. if (!this.containKey(key)) {
  45. size++;
  46. }
  47. // 如果之前不存在,赋值; 如果之前存在,覆盖。
  48. res[key] = value;
  49. };
  50. // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1
  51. this.remove = function (key) {
  52. if (this.containKey(key) && (delete res[key])) {
  53. size--;
  54. }
  55. };
  56. // 哈希表中是否包含key,返回一个布尔值
  57. this.containKey = function (key) {
  58. return (key in res);
  59. };
  60. // 哈希表中是否包含value,返回一个布尔值
  61. this.containValue = function (value) {
  62. // 遍历对象中的属性值,判断是否和给定value相等
  63. for (var prop in res) {
  64. if (res[prop] === value) {
  65. return true;
  66. }
  67. }
  68. return false;
  69. };
  70. // 根据键获取value,如果不存在就返回null
  71. this.getValue = function (key) {
  72. return this.containKey(key) ? res[key] : null;
  73. };
  74. // 获取哈希表中的所有value, 返回一个数组
  75. this.getAllValues = function () {
  76. var values = [];
  77. for (var prop in res) {
  78. values.push(res[prop]);
  79. }
  80. return values;
  81. };
  82. // 根据值获取哈希表中的key,如果不存在就返回null
  83. this.getKey = function (value) {
  84. for (var prop in res) {
  85. if (res[prop] === value) {
  86. return prop;
  87. }
  88. }
  89. // 遍历结束没有return,就返回null
  90. return null;
  91. };
  92. // 获取哈希表中所有的key,返回一个数组
  93. this.getAllKeys = function () {
  94. var keys = [];
  95. for (var prop in res) {
  96. keys.push(prop);
  97. }
  98. return keys;
  99. };
  100. // 获取哈希表中记录的条数,返回一个数值
  101. this.getSize = function () {
  102. return size;
  103. };
  104. // 清空哈希表,无返回值
  105. this.clear = function () {
  106. size = 0;
  107. res = {};
  108. };
  109. }
  110. </script>
  111. </body>
  112. </html>

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

推荐阅读:

如何使用JS+CSS3实现图片响应鼠标移动放大缩小

怎样使用源生JS代码实现百度搜索框

以上就是如何使用JS模拟实现哈希表的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行