我想找到连接到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>
Run Code Online (Sandbox Code Playgroud)
我知道我可以迭代边缘并计算特定节点id的出现次数,例如:
for(var i = 0; i < edges.get().length; i++){
...
}
Run Code Online (Sandbox Code Playgroud)
但使用vis.js内置功能是不是还有其他可能性呢?
这种逻辑确实很容易实现,vis.js中没有内置的功能.有许多不同的用例需要稍微不同的算法,因此我们认为最好将它留给您,并且只是利用JavaScript的灵活性.
在您的情况下,您确实可以只过滤具有您正在寻找的nodeId的边:
function getEdgesOfNode(nodeId) {
return edges.get().filter(function (edge) {
return edge.from === nodeId || edge.to === nodeId;
});
}
Run Code Online (Sandbox Code Playgroud)
其他建议的方法迭代网络中的所有边,仅查看边DataSet。但网络DataSet本身提供了一个函数,当指定getConnectedEdges()a 时,返回一个边 id 数组。nodeId所以要得到你的计数,只需
network.getConnectedEdges(nodeId).length
Run Code Online (Sandbox Code Playgroud)
其中nodeId是您感兴趣的节点的id。
看起来在内部,节点和边直接由 访问[nodeId],而不必进行迭代,因此像这样的函数中的访问时间getConnectedEdges(nodeId)应该大致恒定,而不是与边的数量呈线性关系。
这应该会对大型网络产生巨大的影响。
| 归档时间: |
|
| 查看次数: |
3447 次 |
| 最近记录: |