Javascript 使用forEach()与map()更新d3节点
我有一个D3Force布局图,当页面加载时,它会显示4个节点,并且数据绑定正确。然后,我给用户一个选项,单击一个按钮,该按钮从本质上改变了我的整个可视化,即节点数(现在应该是10个)及其背后的所有数据(即,应用于4个初始节点的任何信息都不相关) 在pageload上,我得到的数据如下Javascript 使用forEach()与map()更新d3节点,javascript,d3.js,Javascript,D3.js,我有一个D3Force布局图,当页面加载时,它会显示4个节点,并且数据绑定正确。然后,我给用户一个选项,单击一个按钮,该按钮从本质上改变了我的整个可视化,即节点数(现在应该是10个)及其背后的所有数据(即,应用于4个初始节点的任何信息都不相关) 在pageload上,我得到的数据如下 var nodes = theData.map(function (d, i) { var random = Math.floor(Math.random() * m);
var nodes = theData.map(function (d, i) {
var random = Math.floor(Math.random() * m);
return {
radius: circleRadiusScale(d.entity_count),
person: d.person,
cx: clusterScale(random),
cy: height / 2
};
});
然后在我的“更改所有数据按钮”上,我有相同的方法
function updateNodeData(dataToUpdate) {
nodes = null;
nodes = dataToUpdate.map(function (d, i) {
var random = Math.floor(Math.random() * m);
return {
radius: circleRadiusScale(dataToUpdate[i].entity_count),
person: dataToUpdate[i].person,
cx: clusterScale(random),
cy: height / 2
};
});
}
上述代码的问题在于,尽管它确保添加了额外的6个节点,但我开始使用的4个节点的数据没有更新。我一开始认为我的更新/退出选择有问题,但后来我在“更改所有数据按钮”中尝试了这段代码
对于nodes.forEach方法,我开始使用的4个节点的数据已成功更新(当然,现在页面上没有新的6个节点)
对我来说,真正奇怪的是,如果我在同一个按钮中使用组合这两种方法(即映射新数据,使我有10个元素,然后执行forEach(),使它们得到更新),那么我只会得到与开始时完全相同的结果-10个元素,其中只有6个是正确的
我真的希望这听起来对某些人来说很熟悉,并且我缺少了一些关于map()和forEach()函数的基本知识。谢谢你的任何想法 很抱歉,但这是我的更新定义的问题。在我读了Lars的评论后:我意识到我用SelectAll而不是Select更新数据是错误的。仍然不确定这是如何解释forEach()和map()的不同行为的,但现在已经解决了这个问题,并且所有内容都在完美地更新。
function updateNodeData(dataToUpdate) {
nodes.forEach(function (d, i){
var random = Math.floor(Math.random() * m);
d.radius = circleRadiusScale(dataToUpdate[i].entity_count);
d.person = dataToUpdate[i].person;
d.cx = clusterScale(random);
d.cy = height / 2;
});
}