2016-11-20 4 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() и т. Д. Разве не удалось бы решить мою проблему, используя некоторые из них?

Причина наличия как key1, так и key2 заключается в том, что я не знал, как убедиться, что направление края не имеет значения.

Редактировать

Я мог бы, в качестве альтернативы, а также сделать что-то вроде

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), если хотите следить за вещами.

Смежные вопросы