Я использую 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).