javascript - 如何对 d3 中的形状选择进行排序

标签 javascript sorting d3.js svg

我需要更改 d3 在 svg 容器中创建的所有形状的顺序。但我做不到。 JSFiddle中的以下脚本,在本地执行时,给出“a 和 b 未定义”。应该如何修正?

var svg = d3.select("body")
.append("svg")
.attr("width", 100)
.attr("height", 100);

svg.append("rect")
.attr({x:0,y:0,height:10,width:10,fill:'yellow'})
.attr("sort",3);
svg.append("rect")
.attr({x:0,y:20,height:10,width:10,fill:'red'})
.attr("sort",2);
svg.append("rect")
.attr({x:0,y:40,height:10,width:10,fill:'blue'})
.attr("sort",1);

d3.selectAll("rect").sort(function(a,b){return a.attr("sort")-b.attr("sort")});

d3.selectAll("rect")
.each(function(d,i){alert(d3.select(this).attr("sort"))});

最佳答案

您需要这样排序:

var rects = d3.selectAll("rect")[0].sort(function(a, b) {
  return d3.select(a).attr("sort") - d3.select(b).attr("sort")
}); //here rects will store the correct sorted order rectangle DOMs.

而不是这样做:

d3.selectAll("rect").sort(function(a,b){return a.attr("sort")-b.attr("sort")});

现在要根据排序更改矩形,如下所示:

rects.forEach(function(rect, i){
    d3.select(rect).attr("y", (i*20));//change the attribute of y
})

工作代码here

注意:我只是根据您提供的信息回答这个问题,但正确的方法是按照@meetamit 在评论中建议的数据方式进行操作。

关于javascript - 如何对 d3 中的形状选择进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488776/

相关文章:

javascript - 复杂的 JS 对象

c++ - 结构节点类数组中的 lower_bound

javascript - d3.js transition() 在浏览器最小化时不起作用

javascript - 向 d3.js 图表添加水平十字准线

javascript - 通过正则表达式级别过滤的长度为 5 的 Python 3.3 itertools 映射

javascript - react-native-table-component 卡住可滚动表中的第一列和第一行

javascript - 占据div中中心的空间

python - 确定子字符串在字符串列表中的位置

c - C 中的冒泡排序函数

javascript - D3 使用图案用图像填充形状