如何检查D3.js力导向图中没有链接的节点并将其删除?

5
我希望控制我的节点,确保它们互相连接,没有独立的节点。
我的脚本每30秒从JSON查询中添加一对新节点。如果其中一个新节点是现有节点的重复项,则图将仅使用唯一节点进行更新,并将其连接到其他现有节点。
在此过程中,我正在移除最旧的节点,以使图表上最多只有10个节点。就在这里,我似乎遇到了麻烦。我该如何移除节点并检查并删除任何未连接到其他节点的残留节点?
该脚本基于knoren发表的文章 “关于添加新节点”
this.checkLength = function () {
  if (nodes.length > 10) {
    var i = links.shift();
    nodes.splice(findNodeIndex(i),1);
    update();
  }
}

2
在更新函数中,检查所有保持节点在屏幕上的条件后,只需执行node.exit().remove()即可删除未使用的节点。在这种情况下很难说哪里出了错,因为您可能已经将添加/删除节点的逻辑分散在几个函数之间,并且只显示其中一个...我想您应该为每个更有可能留在屏幕上的节点分配一个分数或其他东西,然后通过简单的分数> x筛选...这只是一个想法,所以我将其留作评论而不是答案。 - paxRoman
1个回答

2
根据paxRoman的建议,要删除节点,您可以执行以下操作:
node.exit().remove();

现在,要查找空节点,您可以使用力导向节点的weight属性,如力导向布局文档中所述:

weight-节点权重;相关联的链接数。

因此,最后,为了获取所有为空的节点,您可以执行以下操作:

force.nodes().filter(function(d){d.weight==0})

使用force作为您的力导向布局。
请注意,如文档所述,weight属性仅在调用force.start()时初始化:

在将节点传递给布局之前,不需要设置这些属性;如果没有设置,布局在调用start时将初始化合适的默认值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接