Javascript 使用forEach()与map()更新d3节点

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);

我有一个D3Force布局图,当页面加载时,它会显示4个节点,并且数据绑定正确。然后,我给用户一个选项,单击一个按钮,该按钮从本质上改变了我的整个可视化,即节点数(现在应该是10个)及其背后的所有数据(即,应用于4个初始节点的任何信息都不相关)

在pageload上,我得到的数据如下

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;
        });                         
}