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

JS代码中memo缓存未生效:如何让if分支读取缓存值?

问题分析与修复

核心问题

你的代码里setFixes函数的return用法完全错误:

  • if (memo.get(prefix)) return;这句会在第一次发现memo里已有前缀时,直接终止整个setFixes函数,导致后续所有前缀后缀都没机会处理,这也是你觉得分支没触发的核心原因——要么memo初始为空,要么函数提前退出了。
  • 另外,用words.includes()做查询是O(n)的低效操作,不如先把单词转成Set,查询效率直接拉到O(1)。

修复后的代码

const words = [
  "a",
  "alien",
  "born",
  "less",
  "lien",
  "never",
  "nevertheless",
  "new",
  "newborn",
  "the",
  "zebra",
  "zebra",
];
let compoundArr = [];
let memo = new Map();
// 先把单词转成Set,提升查询效率
const wordSet = new Set(words);

const setFixes = () => {
  for (let word of words) {
    for (let i = 1; i < word.length; i++) {
      const prefix = word.substring(0, i);
      const suffix = word.substring(i);
      
      // 前缀处理:如果memo里已有,直接跳过查询
      if (!memo.has(prefix)) {
        if (wordSet.has(prefix)) {
          memo.set(prefix, true);
        }
      }
      
      // 后缀处理:同理,已有则跳过
      if (!memo.has(suffix)) {
        if (wordSet.has(suffix)) {
          memo.set(suffix, true);
        }
      }
    }
  }
};

const findCompound = () => {
  setFixes();
  // 用Set去重,避免重复添加相同单词(比如原数组里的两个zebra)
  const tempSet = new Set();
  for (let word of words) {
    for (let i = 1; i < word.length; i++) {
      const prefix = word.substring(0, i);
      const suffix = word.substring(i);
      if (memo.get(prefix) && memo.get(suffix)) {
        tempSet.add(word);
      }
    }
  }
  compoundArr = Array.from(tempSet);
  return compoundArr;
};

findCompound();
console.log(compoundArr); // 输出:['alien', 'newborn']

关键修改点

  1. 替换return为跳过逻辑:把终止函数的return改成判断!memo.has(),只有当memo里没有当前前缀/后缀时,才去查询单词集合,彻底避免重复操作。
  2. 用Set优化查询:将words转成wordSet,has()方法的查询效率远高于includes(),尤其当单词量很大时差距明显。
  3. 结果去重:原数组里有重复的zebra,用Set存储结果再转成数组,避免输出重复的复合单词。

内容的提问来源于stack exchange,提问作者Ezgi Ergün

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:27