我准备了一个小小提琴来说明这里的问题
我在使用d3的退出函数从dom中删除元素时遇到问题.
假设我有一个包含10个元素的数组:
var data = [1 ,4, 5, 6, 24, 8, 12, 1, 1, 20]
Run Code Online (Sandbox Code Playgroud)
我使用这些数据使用d3创建一个简单的水平条形图
d3.selectAll('rect')
.data(data)
.enter()
.attr("class", "rectangle")
.attr("stroke", "black")
.attr("stroke-width","1px")
.attr("fill","none")
.attr("x", 0)
.attr("y", function(d, i) { return 25 * i; } )
.attr("width", function(d) { return 22 * d; } )
.attr("height", "20");
Run Code Online (Sandbox Code Playgroud)
现在经过短暂的延迟后我想修剪我的数据集,所以我剩下的就是
var truncatedData = [4,5]
d3.selectAll('rect')
.data(truncatedData )
.exit()
.transition()
.delay(3000)
.remove();
Run Code Online (Sandbox Code Playgroud)
数据被成功删除,但它仍显示前两个元素1,4而不是4,5.
如何从dom中删除[4,5]以外的所有内容?
Lar*_*off 19
默认情况下,d3匹配.data()其索引而不是值的元素.也就是说,在第二次调用中给它一个两元素数组意味着保留第一次调用的前两个元素(索引0和1).
要在您的情况下解决此问题,请提供一个函数来匹配第二次调用的元素.data(),即
.data([5, 6], function(d) { return(d); })
Run Code Online (Sandbox Code Playgroud)
修正了这里的 jsfiddle .