根据字符的字符从句子数组中删除重复句子的最佳方法,空格无关紧要

Posted

技术标签:

【中文标题】根据字符的字符从句子数组中删除重复句子的最佳方法,空格无关紧要【英文标题】:Best way to remove duplicate sentences from an array of sentences based on their characters, whitespaces inconsequential 【发布时间】:2021-12-03 16:50:08 【问题描述】:

假设我们有一个这样的数组

const array = ['bic ycle drive', 'bici ycl frei', 'bicyc le dri ve', 'manace', 'bicycle drive', 'bicycle drive']

我希望它返回['bic ycle drive', 'bici ycl frei', 'manace'],因为bic ycle drive, bicyc le dri ve, bicycle drive, bicycle drive 是同一个句子,不同地方有空格。

总结:只返回唯一值,空格不重要。

Ps:我们可以选择任何重复的。

谢谢。

【问题讨论】:

为什么不直接返回不带空格的单词? “实现...的最佳方式” 征求题外话 【参考方案1】:

从 ES6 开始,使用 Set 创建唯一值数组很容易,但在这种情况下,您需要转换字符串(删除空格)以查找重复项,但仍保留原始字符串,以便您可以返回它们。您可以通过创建一个 Map 来做到这一点,其中“没有空格的字符串”作为键,原始字符串作为值。由于 Map 的键是唯一的。

使用Array.map() 创建一个映射以生成[string without spaces, string] 的数组。然后将 Map.values() 迭代器转换回数组。这将返回每一系列重复项中的最后一项。

const array = ['bic ycle drive', 'bici ycl frei', 'bicyc le dri ve', 'manace', 'bicycle drive', 'bicycle drive']

const result = [...new Map(
  array.map(str => [str.replace(/\s+/g, ''), str])
).values()]

console.log(result)

如果您想要一系列重复项中的第一项,可以使用Array.reduce() 创建 Map,并且仅在它们不存在时分配键:

const array = ['bic ycle drive', 'bici ycl frei', 'bicyc le dri ve', 'manace', 'bicycle drive', 'bicycle drive']

const result = [...array.reduce((acc, str) => 
  const key = str.replace(/\s+/g, '')
  
  return acc.has(key) ? acc : acc.set(key, str)
, new Map()).values()]

console.log(result)

【讨论】:

很聪明 这真的很酷。谢谢。 不客气 :)

以上是关于根据字符的字符从句子数组中删除重复句子的最佳方法,空格无关紧要的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 如果找到数组中的某个单词,则缩短字符串中的句子

搜索自然语言句子结构

提取句子/字符串中的最后一个单词?

如何从句子中删除多余的空格、制表符和换行符,并仅用一个空格替换它们? [复制]

具有多种变体的 Foreach 字符串替换

x86汇编-句子中字符的频率[重复]