时间:2021-07-01 10:21:17 帮助过:24人阅读
在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关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实现图片响应鼠标移动放大缩小
怎样使用源生JS代码实现百度搜索框
以上就是如何使用JS模拟实现哈希表的详细内容,更多请关注Gxl网其它相关文章!