当前位置:首页 > JavaScript

js实现hashmap

2026-03-14 17:27:39JavaScript

实现基础结构

在JavaScript中,可以通过对象或Map类实现哈希表。对象的方式简单但功能有限,Map则支持更复杂的操作(如任意类型的键)。

使用对象实现

class SimpleHashMap {
  constructor() {
    this.storage = {};
  }

  set(key, value) {
    this.storage[key] = value;
  }

  get(key) {
    return this.storage[key];
  }

  delete(key) {
    delete this.storage[key];
  }
}

使用Map

js实现hashmap

const map = new Map();
map.set('key', 'value'); // 添加键值对
map.get('key');          // 获取值
map.delete('key');       // 删除键值对

处理冲突(对象方式)

对象的键只能是字符串或Symbol,需处理冲突和哈希计算。可通过以下方法改进:

哈希函数示例

js实现hashmap

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash = (hash << 5) + key.charCodeAt(i);
  }
  return hash % 37; // 假设桶大小为37
}

链地址法解决冲突

class AdvancedHashMap {
  constructor(size = 37) {
    this.size = size;
    this.buckets = Array(size).fill(null).map(() => []);
  }

  set(key, value) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const found = bucket.find(item => item[0] === key);
    found ? found[1] = value : bucket.push([key, value]);
  }

  get(key) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const found = bucket.find(item => item[0] === key);
    return found ? found[1] : undefined;
  }
}

性能优化

  • 动态扩容:当元素数量超过负载因子(如75%)时,扩大桶数组并重新哈希所有元素。
  • 素数桶大小:使用素数作为桶大小可减少哈希冲突。

扩容示例

resize(newSize) {
  const oldBuckets = this.buckets;
  this.size = newSize;
  this.buckets = Array(newSize).fill(null).map(() => []);
  oldBuckets.forEach(bucket => {
    bucket.forEach(([key, value]) => this.set(key, value));
  });
}

使用场景建议

  • 对象:适合键为简单字符串、无需复杂操作的场景。
  • Map:需支持任意类型键、频繁增删或遍历时优先使用。
  • 自定义实现:需学习哈希表原理或特殊需求时使用。

标签: jshashmap
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…