De esto:
[["a", "b"], ["a", "c"], ["a", "d"], ["d", "e"], ["d", "f"], ["f", "g"]]
A esto:
[["a", "b"], ["a", "c"], ["a", "d", "e"], ["a", "d", "f", "g"]]
El primer elemento de cada matriz interna representa un "padre" y el segundo un "hijo", por lo que el objetivo final es encontrar nietos, bisnietos... y luego agruparlos en matrices más grandes, donde todos los descendientes estén juntos.
Tal vez sea una tarea fácil, ¡pero he estado luchando para descubrir cómo conseguirlo!
Si desea obtener todas las relaciones, sin partes que estén incluidas en otros resultados, puede obtener un objeto de todos los descendientes y comenzar con los padres que no tienen padres.
let getNodes = k => parents[k] ? parents[k].flatMap(getNodes).map(a => [k, ...a]) : [[k]], data = [["a", "b"], ["a", "c"], ["a", "d"], ["d", "e"], ["d", "f"], ["f", "g"]], parents = {}, children = new Set, result; for (const [p, c] of data) { (parents[p] ??= []).push(c); children.add(c); } result = Object .keys(parents) .filter(p => !children.has(p)) .flatMap(getNodes); result.map(a => console.log(...a));