JavaScript统计高频词时数组排序出现重复单词问题
问题原因
出现单词重复的核心问题和排序逻辑无关,是去重逻辑完全失效导致的,具体原因有两点:
Set对于对象这类引用类型的去重判断依据是内存引用地址,而非对象的实际内容。你每次循环执行set.add()时传入的都是新创建的对象字面量,哪怕两个对象的word、count属性完全一致,因为是不同的内存地址,Set会判定为两个不同的值,全部保留,根本没有实现去重效果。- 循环遍历的是所有匹配到的单词原始数组
arr,没有先对遍历的单词做去重。比如单词love在示例文本中出现了6次,循环就会执行6次添加{word:'love', count:6}对象的操作,最终Set里会存入6个内容完全相同的love统计对象,排序后自然会出现重复条目。
另外原有代码还有个隐含问题:正则匹配开启了忽略大小写模式,但统计时没有统一单词大小写,会导致If和if这类大小写不同的同个单词被判定为两个独立单词统计,结果不准。
修正后代码
const paragraph = `I love teaching. If you do not love teaching what else can you love. I love Python if you do not love something which can give you all the capabilities to develop an application what else can you love.`; const tenMostFrequentWords = (str) => { const regex = /\b[a-z]+\b/gi; const wordArr = str.match(regex); const frequencyMap = new Map(); // 单次遍历统计词频,效率更高也不会重复 for (const word of wordArr) { const formatWord = word.toLowerCase(); frequencyMap.set(formatWord, (frequencyMap.get(formatWord) ?? 0) + 1); } // 转数组、排序、取前10个高频词 return Array.from(frequencyMap, ([word, count]) => ({word, count})) .sort((a, b) => b.count - a.count) .slice(0, 10); } console.log(tenMostFrequentWords(paragraph));
内容的提问来源于stack exchange,提问作者conradQQ
相关产品推荐
相关产品推荐

