VisJs - 获取特定节点的边数

时间:2016-01-14 13:47:24

标签: javascript vis.js

我想在visjs / javascript中找到连接到特定节点的边数。

为了说明我的需要,我已经编写了这个例子:

<html>
<head>
    <title>Get number of edges of a specific node</title>
    <script type="text/javascript" src="/home/altug/Downloads/BTAGViewer/libs/visjs/vis.min.js"></script>
</head>
<body>
    <div id="mynetwork"></div>
    <script type="text/javascript">
      // create an array with nodes
      var nodes = new vis.DataSet([
        {id: "A", label: 'label A'},
        {id: "B", label: 'label B'},
        {id: "C", label: 'label C'},
        {id: "D", label: 'label D'},
        {id: "E", label: 'label E'}
      ]);

      // create an array with edges
      var edges = new vis.DataSet([
        {from: "A", to: "C"},
        {from: "A", to: "B"},
        {from: "B", to: "D"},
        {from: "B", to: "E"}
      ]);

      // create a network
      var container = document.getElementById('mynetwork');
      var data = {
        nodes: nodes,
        edges: edges
      };
      var options = {};
      var network = new vis.Network(container, data, options);

      var some_id = "B";
      var some_node = nodes.get(some_id);
      console.dir(some_node);

      console.log(/*magically retrieve the number of edges for node "B" ---> 3 (for this graph)*/);
    </script>
</body>

我知道我可以迭代边缘并计算特定节点id的出现次数,例如:

for(var i = 0; i < edges.get().length; i++){
    ...
}

但使用vis.js内置功能是不是还有其他可能性?

3 个答案:

答案 0 :(得分:7)

这种逻辑确实很容易实现,vis.js中没有内置的功能。有许多不同的用例需要稍微不同的算法,因此我们认为最好将它留给您,并且只是利用JavaScript的灵活性。

在你的情况下,你确实可以过滤掉你正在寻找的nodeId的边缘:

function getEdgesOfNode(nodeId) {
  return edges.get().filter(function (edge) {
    return edge.from === nodeId || edge.to === nodeId;
  });
}

答案 1 :(得分:2)

对于那些试图获得连接两个节点的边缘的人:

function getEdgeBetweenNodes(node1,node2) {
    return edges.get().filter(function (edge) {
        return (edge.from === node1 && edge.to === node2 )|| (edge.from === node2 && edge.to === node1);
    });
};

答案 2 :(得分:2)

其他建议的方法遍历网络中的所有边缘,仅查看边缘 DataSet 。但是网络 DataSet 本身提供了getConnectedEdges()函数,在指定nodeId时返回边缘ID数组。所以为了得到你的数量,它只是

network.getConnectedEdges(nodeId).length  

其中 nodeId 是您感兴趣的节点的ID。

看起来在内部,节点和边缘由[nodeId]直接访问,而不必进行迭代,因此像getConnectedEdges(nodeId)这样的函数中的访问时间应该大致不变,而不是线性的。边数。

这应该会对大型网络产生巨大影响。