如何在JS中按常用元素对子数组进行分组

stc*_*vrw 1 javascript arrays

我有一个子数组数组。每个子阵列具有至少一个在至少一个以上子阵列中重复的元素。例如:

[
    ['aaa', 'bbb', 'ccc'],
    ['ddd', 'aaa'],
    ['aaa', 'bbb', 'ccc', 'eee'],
    ['kkk', 'mmm', 'nnn'],
    ['mmm', 'ooo']
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,'ddd'和'eee'不会在任何地方重复,但是同一子数组中的另一个元素至少在另一个子数组中是重复的。我需要对新子数组中的元素进行分组以接收以下输出:

[
    ['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
    ['kkk', 'mmm', 'nnn', 'ooo']
]
Run Code Online (Sandbox Code Playgroud)

换句话说,我需要将“朋友”分组。因此,如果“ ddd”是“ aaa”的某个地方的“朋友”,并且如果“ eee”是“ bbb”的某个地方的朋友,并且“ aaa”和“ bbb”也是朋友,则我们将它们全部分组在一个新的子数组中。但是'mmm'不是'aaa','bbb'等的朋友,而是kkk和nnn和ooo的朋友,因此将它们分组在另一个子数组中

Nen*_*car 5

您可以先使用reduceSet获取具有唯一值的数组,然后将map其转换为具有唯一值的数组。

const data = [
  ['aaa', 'bbb', 'ccc'],
  ['ddd', 'aaa'],
  ['aaa', 'bbb', 'ccc', 'eee'],
  ['kkk', 'mmm', 'nnn'],
  ['mmm', 'ooo']
]

const result = data.reduce((r, e) => {
  const match = r.find(a => e.some(s => a.has(s)))
  if (!match) r.push(new Set(e));
  else e.forEach(el => match.add(el))
  return r
}, []).map(e => Array.from(e))

console.log(result)
Run Code Online (Sandbox Code Playgroud)