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

Best way to remove duplicate sentences from an array of sentences based on their characters, whitespaces inconsequential

假设我们有这样一个数组

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

我要return['bic ycle drive', 'bici ycl frei', 'manace']因为bic ycle drive, bicyc le dri ve, bicycle drive, bicycle drive是同一句白space不同地方

总结:只是return唯一值,白色space不重要。

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

谢谢。

从 ES6 开始,使用 Set 创建唯一值数组很容易,但在这种情况下,您需要转换字符串(删除 spaces)以找到重复项,但仍保留原始字符串,所以你可以 return 他们。为此,您可以创建一个以“不带 space 的字符串”为键,以原始字符串为值的 Map。由于 Map 的键是唯一的。

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

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() 创建映射,并且仅在键不存在时分配键:

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)