2016-11-20 4 views
2

私はCytoscape.jsを使用しています。いくつかのノードがエッジに接続されています。Cytoscape.jsのノード間でユニークなペアを見つける

2つのノード間の各接続をループする必要があります。問題は、2つのノードの間に複数のエッジがあることがあるため、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 
    } 
    }); 
}); 

ような何かを行うことができますが、また、それらの多くは、それらの間のエッジを持っていないので、愚かなアプローチではありませんか?そして、もし私が2つのノードAとBを持っていれば、このアプローチは2つの関係(A→BとB→Aの両方)を与えます。

答えて

0

トラバース機能を見てみましょう:たとえばhttp://js.cytoscape.org/#collection/traversing

は、node.edgesWith(node2)node.edgesTo(node2) gives directed ones. node.connectedEdgesに対し、ノード間の無向辺を() `1つのノードとすべてに集中したい場合にも興味があるかもしれできます特定のノードのペアではなく、その接続です。

要素のコレクションはセットとして使用できるため、物事を追跡したい場合はtoTraverse = toTraverse.difference(justTraversed)を実行できます。

関連する問題