当前位置:首页 > 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

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

处理冲突(对象方式)

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

哈希函数示例

_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%)时,扩大桶数组并重新哈希所有元素。
  • 素数桶大小:使用素数作为桶大小可减少哈希冲突。

扩容示例

js实现hashmap

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实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…