如何优化数组相似度检测?哈希数组段落去重逻辑修复求助
嘿,你的问题出在filter里的判断逻辑上——原代码里的paragraph[index].includes(paragraph[0])完全是个逻辑错误,paragraph是当前遍历到的字符串,paragraph[index]取的是这个字符串的第index个字符,这根本不是你想要的「检查当前段落是否被其他段落包含」的逻辑!
咱们把逻辑改对就行,核心思路是:对每个段落,判断数组里有没有其他段落完整包含它,如果有就过滤掉,没有就保留。修正后的链式调用代码如下:
const description = hotel .description() .map(descriptions => descriptions.paragraph) .filter((currentPara, _, allParas) => { // 检查是否存在其他段落包含当前段落 return !allParas.some(para => para !== currentPara && para.includes(currentPara)); });
我来拆解下这段代码的逻辑:
filter的第三个参数allParas拿到了整个段落数组的引用,这样我们能遍历所有元素做对比some方法会遍历数组,只要找到任意一个不是当前段落的元素,并且这个元素包含当前段落,就返回true- 我们用
!取反,意思就是:如果没有其他段落包含当前段落,就保留它
来验证两种场景:
- 前缀相似的情况:
["Welcome to the best place", "Welcome to the best place in the world, Boston!"]- 第一个段落被第二个包含,
some返回true,取反后是false,所以被过滤;第二个段落没有被其他元素包含,会被保留,结果符合预期
- 第一个段落被第二个包含,
- 所有段落互不包含的情况:
["You are here at the best place", "Welcome to the best place in the world, Boston!"]- 两个段落都不被对方包含,
some返回false,取反后是true,所以两个都保留,完美符合你的需求
- 两个段落都不被对方包含,
这样修改后,不管有没有相似的段落,都能得到正确的结果啦!
内容的提问来源于stack exchange,提问作者Rembrandt Reyes




