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

JavaScript数组变位词过滤问题:为何仍残留一个变位词?

问题分析与解决方案

你的函数之所以会残留"anp",是因为它的逻辑是保留每个变位词组的最后一个元素,而非移除所有存在变位词的单词。

具体来说:

  • 遍历数组时,"nap"、"pna"、"anp"排序后都是"anp",每次调用map.set(sorted, word)都会覆盖之前的对应值,最后这个键对应的值变成了最后遍历到的"anp",所以它会被保留在结果里。

如果你需要移除所有存在变位词的单词(只留无变位词的单词)

也就是只要数组里有其他单词和当前单词是变位词,就把这些单词全部删掉,只留下没有变位词的"teachers",可以这样修改代码:

function aclean(arr) {
  let countMap = new Map();
  // 先统计每个变位词组的单词数量
  for (let word of arr) {
    let sorted = word.toLowerCase().split('').sort().join('');
    countMap.set(sorted, (countMap.get(sorted) || 0) + 1);
  }
  // 过滤出仅单个单词的变位词组
  return arr.filter(word => {
    let sorted = word.toLowerCase().split('').sort().join('');
    return countMap.get(sorted) === 1;
  });
}

let arr = ["nap", "teachers", "pna", "anp"];
console.log(aclean(arr)); // ["teachers"]

如果你需要每个变位词组只保留一个(移除重复的变位词)

当前函数逻辑是保留最后一个出现的变位词,如果你想保留第一个出现的,可以调整为仅当键不存在时才存入Map:

function aclean(arr) {
  let map = new Map();

  for (let word of arr) {
    let sorted = word.toLowerCase().split('').sort().join('');
    // 只保留第一个出现的变位词
    if (!map.has(sorted)) {
      map.set(sorted, word);
    }
  }
  return Array.from(map.values());
}

let arr = ["nap", "teachers", "pna", "anp"];
console.log(aclean(arr)); // ["nap", "teachers"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:57:17