2016-11-20 11 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가있는 경우이 접근 방식은 두 개의 관계 (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)을 수행 할 수 있습니다.