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
相关产品推荐
相关产品推荐

