JavaScript 模拟实现哈希表及双数求和问题应用

作者:闭包旅人时间:2026-10-22 14:00:42浏览:195

本文介绍如何使用 JavaScript 模拟实现哈希表,涵盖属性枚举、删除、检测与添加等基础操作。通过构造函数封装增删改查功能,并应用于解决无序数组中两数之和指定值的问题,返回对应下标,供开发者参考学习。

JavaScript 模拟哈希表实现与应用

本文通过实例展示如何在 JavaScript 中模拟实现哈希表,并提供相关应用案例,供读者参考学习。

在算法设计中,特别是涉及数组处理的场景下,哈希表能高效解决诸多问题。本文将记录 JavaScript 实现哈希表的方法,并给出解决具体实际问题的示例。

需要说明的是,本文所述的实现并非严格意义上的哈希表,其功能与使用场景与标准哈希表存在相似之处。

哈希表相关基础知识

第一部分:相关知识点

属性的枚举操作


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

输出结果示例

JavaScript 模拟哈希表实现与应用

对于 JavaScript 对象,可以使用 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 关键字删除对象的属性,该操作会返回一个布尔值。具体示例如下

JavaScript 模拟哈希表实现与应用

注意:通常情况下,只有对象的属性可以被删除,而普通变量无法通过 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 属性。

JavaScript 哈希表的具体实现

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

下面通过构造函数创建一个哈希表类,使用时只需实例化该对象即可。该实现提供了较为丰富的功能,在实际问题中可根据需要选择性使用。


// 创建构造函数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>

在实际开发中,可以先编写主要功能,后续如有需要再逐步添加其他特性。

此外,这里提供几款哈希操作相关的在线工具供参考

在线散列/哈希算法加密工具: http://tools.jb51.net/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具: http://tools.jb51.net/password/hash_md5_sha

更多关于 JavaScript 相关内容感兴趣的读者可查看本站专题:《javascript编码操作技巧总结》、《JavaScript加密解密技巧汇总》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述内容对大家学习 JavaScript 程序设计有所帮助。

作者最新文章