You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现哈希表时returnAll方法未返回所有插入节点问题求解

问题根源
  • 你的insert方法默认实现了相同key覆盖更新的逻辑:插入时只要检测到当前链表中存在相同key的节点,就会直接修改该节点的value值,不会新增节点存储旧的value,所以相同key的历史插入记录不会被保留,最终returnAll只会返回不同key的最新插入结果。
  • 额外说明:你现有的get方法还存在两处可修复问题:一是循环判断时取的是桶的头节点key而非当前遍历节点的key,二是遍历语句只写了currentNode.next没有赋值给currentNode,运行时会进入死循环。
修改方案

如果你的需求是存储所有插入的节点,允许重复key保留所有历史插入记录,只需要删除insert中所有相同key的判断更新逻辑,不管key是否重复,都直接在链表末尾新增节点即可,同时可按需修复get方法的逻辑:

class HasTable {
  constructor(size) {
    this.buckets = Array(size);
    this.numBuckets = this.buckets.length;
  }

  hash(key) {
    let sum = 0;
    for (let i = 0; i < key.length; i++) {
      sum += key.charCodeAt(i);
    }
    let bucket = sum % this.numBuckets;
    return bucket;
  }

  // 修改后的insert:删除相同key覆盖逻辑,直接追加新节点
  insert(key, value) {
    let index = this.hash(key);
    console.log("INDEX", index);
    if (!this.buckets[index]) {
      this.buckets[index] = new HashNode(key, value);
    } else {
      let currentNode = this.buckets[index];
      while (currentNode.next) {
        currentNode = currentNode.next;
      }
      currentNode.next = new HashNode(key, value);
    }
  }

  // 修复后的get:返回同一个key对应的所有插入value
  get(key) {
    let index = this.hash(key);
    if (!this.buckets[index]) return null;
    let values = [];
    let currentNode = this.buckets[index];
    while (currentNode) {
      if (currentNode.key === key) {
        values.push(currentNode.value);
      }
      currentNode = currentNode.next;
    }
    return values.length ? values : null;
  }

  returnAll() {
    let allNodes = [];
    for (let i = 0; i < this.numBuckets; i++) {
      let currentNode = this.buckets[i];
      while (currentNode) {
        allNodes.push({key: currentNode.key, value: currentNode.value});
        currentNode = currentNode.next;
      }
    }
    return allNodes;
  };
}

class HashNode {
  constructor(key, value, next) {
    this.key = key;
    this.value = value;
    this.next = next || null;
  }
}

// 测试代码
let has = new HasTable(30);
has.insert("a", "gmail.com");
has.insert("b", "hotmail.com");
has.insert("b", "hotmailHOTMAIL.com");
has.insert("c", "gstar.com");
has.insert("d", "oke.com");
has.insert("e", "nice.com");
has.insert("e", "nice99.com");
has.insert("e", "nice101.com");

console.log(has.returnAll()); // 此时会输出8条节点,包含所有插入记录

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:54:05