怎么使用JS实现哈希表

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

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

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

第一部分:相关知识点

属性的枚举:

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

登录后复制

输出:

怎么使用JS实现哈希表

即对于对象而言,我们可以使用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 来删除,并且会有一个返回值。 如下:

怎么使用JS实现哈希表

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

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实现哈希表

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

// 创建构造函数HashTablefunction 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开始),假设数组元素的值各不相同。

实现如下:

    哈希表的使用    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 = {};    };  }  

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

怎样使用JS实现百度搜索框

怎样使自己的js代码国际化

以上就是怎么使用JS实现哈希表的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2758639.html

(0)
上一篇 2025年3月8日 08:15:37
下一篇 2025年3月8日 00:13:09

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Ajax+Struts2实现验证码验证功能(图文教程)

    这篇文章主要介绍了ajax+struts2实现验证码验证功能实例代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 众所周知,验证码在我们的生活中都是非常常见的,很多公司都在各种折腾各种各样的验证码,这里简要的用一个小案例来实…

    2025年3月8日
    200
  • Ajax调用restful接口传送Json格式数据的方式(附有代码)

    这篇文章主要介绍了ajax调用restful接口传送json格式数据的方法的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧 ajax传送json格式数据,关键是指定contentType,data要是json格式 如果是res…

    编程技术 2025年3月8日
    200
  • 基于Ajax技术实现文件上传带进度条

    这篇文章主要介绍了基于ajax技术实现文件上传带进度条的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能。在文件上传过程中,经常需要用户进行长时间的等待…

    编程技术 2025年3月8日
    200
  • 深入浅析Nginx实现AJAX跨域请求问题

    ajax从一个域请求另一个域会有跨域的问题。那么如何在nginx上实现ajax跨域请求呢?此问题难住很多朋友,下面我给大家带来了nginx实现ajax跨域请求问题的相关知识,感兴趣的朋友一起学习吧 AJAX从一个域请求另一个域会有跨域的问题…

    编程技术 2025年3月8日
    200
  • 妙用Ajax技术实现局部刷新商品数量和总价实例代码

    这篇文章主要给大家介绍妙用ajax技术实现局部刷新商品数量和总价实例代码,非常不错,需要的朋友一起看看吧 1. 问题的分析   先看一下页面中的情况:     功能如上,在没有Ajax之前,一般都是根据用户修改的值去找Action,然后返回…

    2025年3月8日
    200
  • laypage前端分页插件实现ajax异步分页

    laypage是一款多功能的js分页组件,即适用于异步分页,又可用于传统的整页刷新跳页,还支持信息流加载,并且可无缝迁移至node.js平台,这篇文章主要介绍了laypage前端分页插件,实现ajax异步分页,需要的朋友可以参考下 本文实例…

    编程技术 2025年3月8日
    200
  • JS中变量与函数提升步骤详解

    这次给大家带来JS中变量与函数提升步骤详解,JS中变量与函数提升的注意事项有哪些,下面就是实战案例,一起来看一下。 1在js中只有两种作用域 a:全局作用域 b:函数作用域 在ES6之前,js是没有块级作用域。 首先来解释一下什么是没有块级…

    2025年3月8日 编程技术
    200
  • 如何使用node.js启动后台运行forever

    这次给大家带来如何使用node.js启动后台运行forever,使用node.js启动后台运行forever的注意事项有哪些,下面就是实战案例,一起来看一下。 我们知道想要项目部署后运行 需要使用命令行 cd 到项目目录然后执行 npm i…

    编程技术 2025年3月8日
    200
  • 怎样使用JS+H5实现微信摇一摇

    这次给大家带来怎样使用JS+H5实现微信摇一摇,使用JS+H5实现微信摇一摇的注意事项有哪些,下面就是实战案例,一起来看一下。 项目终于如约上线,但是在春节前又有一个新的活动要做,类似微信的摇一摇活动。也一直在做微信公众号的东西,但是要调用…

    2025年3月8日 编程技术
    200
  • 如何使用AJAX实现按需加载

    如何使用ajax实现按需加载?下面我就为大家带来一篇如何使用ajax实现按需加载【推荐】。我觉得挺不错的,现在分享给大家,也给大家做个参考。 按需加载的优势:在实际调查中发现,很多的网民在游览网站时具有明确的指向性,往往在进入主页后直接搜索…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论