在Cytoscape.js中查找节点之间的唯一对

我正在使用Cytoscape.js 。 我有一些节点连接的边缘。

我想循环两个节点之间的每个连接。 问题是,在某些情况下,两个节点之间有多条边,所以我不能只说cy.edges().forEach()因为它会导致循环遍历所需的边。

我能做的就是说一些类似的东西

 const alreadyVisited = []; cy.edges().forEach(edge => { const key1 = edge.source() + '-' + edge.target(); const key2 = edge.target() + '-' + edge.source(); if (alreadyVisited.indexOf(key1) === -1 && alreadyVisited.indexOf(key2)) { // ... alreadyVisited.push(key1); alreadyVisited.push(key2); } }) 

但似乎有点愚蠢。 Cytoscape有一些函数edges.parallelEdges()nodes.connectedEdges()eles.neighborhood()等等。难道有可能利用其中的一些解决我的问题吗?

同时拥有key1key2的原因是因为我不知道如何确定边缘的方向并不重要。

编辑

或者,我也可以做类似的事情

 cy.nodes().forEach(node1 => { cy.nodes().forEach(node2 => { if (node1 !== node2) { // now I have each pair } }); }); 

但这不是一个愚蠢的做法,因为他们中的许多人之间没有边缘? 如果我有两个节点A和B,这种方法将给出2个关系(A→B和B→A)。

看一下遍历函数: http : //js.cytoscape.org/#collection/traversing

例如, node.edgesWith( node2 )给出节点之间的无向边,而node.edgesTo( node2 ) gives directed ones. 如果你想关注一个节点及其所有连接,而不是特定的一对节点,node.connectedEdges()`也可能是有意义的。

元素的集合可以作为集合使用,所以如果你想跟踪事物,你可以这样做: toTraverse = toTraverse.difference( justTraversed )

Interesting Posts