我正在使用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)。
答案 0 :(得分:0)
查看遍历函数:http://js.cytoscape.org/#collection/traversing
例如,node.edgesWith( node2 )
给出节点之间的无向边,而node.edgesTo( node2 ) gives directed ones.
node.connectedEdges()`如果你想要关注一个节点及其所有连接而不是特定的连接,也可能是有意义的。一对节点。
元素集合可以用作集合,因此如果你想跟踪事物,你可以toTraverse = toTraverse.difference( justTraversed )
。