使用lodash,我创建了一个对数组,每个对代表一个链接的源和目标。因此,对于给定的链接路径,我有:
[ [a, b], [a, c], [d, c] ]
第一个元素是链中的第一个链接。 我原本想将这些对映射到键/值映射对象中,然后通过键和/或值来查找头部。
简化算法:
keys.contains(a) || values.contains(a)
如果要么返回true(当然不包括对子本身),那么它不是头部。 所以,从第一对开始,keys.contains(a)|| values.contains(a)返回true,因此它不是head,而key.contains(b)|| values.contains(b)返回false - 所以它必须是头部。
问题:我无法将对映射到对象中,因为可能存在相互覆盖的键/值重复。
即,对于上面的例子,结果对象将是:
{
a: c,
d: c
}
我知道我可以循环使用它们,但是我不愿意这么多循环,除非我必须...
有关更有效解决方案的想法吗?
答案 0 :(得分:0)
我假设源是键,目标是值。有向图的根是那些不作为值出现的键。 (叶子:反之亦然)。
a
将是一个根,以及d
。 b
和c
不是。您的情况应为keys.contains(a) && !values.contains(a)
。
如果对象指向彼此([ [a, b], [b, a] ]
)或某些东西指向自身([ [a, a] ]
),您可能根本没有根。
现在,如果您消除了自引用,则可以收集键和值。为了得到根,你遍历键并测试它们是否不是值。要获取叶子,您将遍历值并测试它们是否不是密钥。
HTH,但我不确定我是否理解你的问题。