D3多维数据集条形图循环排序异常问题咨询
解决D3条形图循环排序混乱的问题
我一眼就揪出问题所在啦——你漏了关键的取余运算!咱们一步步理清楚:
核心问题
你初始化了s = -1,但点击时只写了s = (s + 1),没对3取余。这会导致点击三次后,s的值变成3、4、5……而你的每组数据只有3个元素(索引0、1、2),此时a[s]和b[s]都是undefined。d3.ascending比较undefined时会返回0,相当于没有实际排序,结果自然看起来混乱。
修正后的代码
只需要给s的更新加上取余运算,保证它在0、1、2之间循环,再调整一个小细节(selection.sort不需要重新绑定dataset,它会直接对DOM元素排序):
var s = -1; svg.on("click", function() { s = (s + 1) % 3; // 关键:让s在0、1、2循环切换 svg.selectAll("rect") .sort(function(a, b) { return d3.ascending(a[s], b[s]); }) .transition() .duration(500) .attr("x", function(d, i) { return xScale(i); }); });
为什么这样就对了?
- 第一次点击:
s从-1变成0,按高度(第一个值)升序排序 - 第二次点击:
s变成1,按宽度(第二个值)升序排序 - 第三次点击:
s变成2,按透明度(第三个值)升序排序 - 第四次点击:
s通过取余回到0,又开始按高度排序,完美实现循环排序逻辑
这样修改后,你的点击排序就会严格按照预期顺序执行啦!
内容的提问来源于stack exchange,提问作者Alan Yueh
相关产品推荐
相关产品推荐

