2016-11-20 129 views
2

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

回答

0

看看横移功能:http://js.cytoscape.org/#collection/traversing

例如,node.edgesWith(node2)给人而node.edgesTo(node2) gives directed ones. node.connectedEdges节点之间无向边()`也可能会感兴趣,如果你想集中一个节点上的所有它的连接而不是特定的一对节点。

元素的集合可以用作集,所以你可以做toTraverse = toTraverse.difference(justTraversed),如果你想跟踪的东西。