2

我正在使用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)。

4

1 回答 1

0

Take a look at the traversing functions: http://js.cytoscape.org/#collection/traversing

For example, node.edgesWith( node2 ) gives undirected edges between the nodes whereas node.edgesTo( node2 ) gives directed ones.node.connectedEdges()` may also be of interest if you want to focus on one node and all its connections rather than a specific pair of nodes.

The collections of elements can be used as sets, so you can do toTraverse = toTraverse.difference( justTraversed ) if you want to keep track of things.

于 2016-11-22T19:52:48.853 回答