在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()
等等。难道有可能利用其中的一些解决我的问题吗?
同时拥有key1
和key2
的原因是因为我不知道如何确定边缘的方向并不重要。
编辑
或者,我也可以做类似的事情
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 )
。