D3.js 如何删除D3 force布局中的节点?

D3.js 如何删除D3 force布局中的节点?,d3.js,force-layout,D3.js,Force Layout,我有一个简单的D3模拟,看起来像这样 单击“删除1和4”按钮时,我希望从模拟中删除节点1和4。然而,结果如下: 从外观上看,它似乎已经删除了3和4(而不是1和4) 我的代码如下。你知道我需要做什么才能让它正常工作吗 我假设我从根本上误解了d3中更新节点的工作原理。谢谢你的帮助 拆下1和4 可变宽度=400, 高度=400; var节点=[1,2,3,4].map(函数(x){return{name:x}); var-force=d3.layout.force() .尺寸([宽度、高度])

我有一个简单的D3模拟,看起来像这样

单击“删除1和4”按钮时,我希望从模拟中删除节点1和4。然而,结果如下:

从外观上看,它似乎已经删除了3和4(而不是1和4)

我的代码如下。你知道我需要做什么才能让它正常工作吗

我假设我从根本上误解了d3中更新节点的工作原理。谢谢你的帮助


拆下1和4
可变宽度=400,
高度=400;
var节点=[1,2,3,4].map(函数(x){return{name:x});
var-force=d3.layout.force()
.尺寸([宽度、高度])
.节点(节点)
.linkDistance(30)
。收费(-500)
.在(“滴答”,滴答)上;
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度);
var content=svg.append(“g”);
var nodesData=force.nodes(),
nodeElement=content.selectAll(“.node”);
函数tick(){
attr(“transform”,函数(d){return“translate”(“+d.x+”,“+d.y+”)”);});
}
d3.选择全部('button')。在('click',function()上{
//拆下1和4
节点数据=[
nodesData[1],
节点数据[2]
]
刷新();
});
var宽度=100;
//
//此逻辑稍微修改自http://bl.ocks.org/tgk/6068367
//
函数刷新(){
force.nodes(nodesData)
nodeElement=nodeElement.data(nodesData);
var nodeGroup=nodeElement.enter()
.append('g')
.attr(“类”、“节点”);
//节点文本
nodeGroup.append(“文本”)
.attr(“类”、“节点文本”)
.attr(“dx”,宽度/2)
.attr(“dy”,“14px”)
.text(函数(n){return'node'+n.name})
nodeElement.exit().remove();
force.start();
}
刷新();

您可以通过在
刷新
函数内的
调用中添加一个“key”函数来解决问题:
nodeElement=nodeElement.data(nodesData,函数(d){return d.name})

您看到的问题并不特定于更新节点。通常,选择基于数据数组的索引。因此,如果第一个D3有
[a,b,c,d]
,现在它有
[a,d]
,它将接受前两个元素(
[a,b]
),除非你告诉它定义数组中每个项的键。这就是上面的函数所做的


有关详细信息,请参见您可以通过在
刷新
函数中的
调用中添加一个“key”函数来解决问题:
nodeElement=nodeElement.data(nodesData,函数(d){return d.name})

您看到的问题并不特定于更新节点。通常,选择基于数据数组的索引。因此,如果第一个D3有
[a,b,c,d]
,现在它有
[a,d]
,它将接受前两个元素(
[a,b]
),除非你告诉它定义数组中每个项的键。这就是上面的函数所做的

欲了解更多信息,请参阅