我正在尝试使用sort函数按升序对表中的行进行排序。
var forsort = d3.keys(csv[0]).filter(function(key) {
return key != "name";
});
var tr = d3.selectAll("tbody tr");
d3.selectAll("thead th").data(forsort).on("click", function(k) {
tr.sort(d3.ascending);
});
出于某种原因,18个中只有3行被交换(准确地说是2,3,11行),第2行是第一个可排序的行。
有人可以告诉我问题是什么吗?
答案 0 :(得分:2)
从d3文档中,d3.ascending
看起来像这样
function(a, b) {
return a < b ? -1 : a > b ? 1 : 0;
}
您的案件中a
和b
是什么?您可以通过以下方式进行检查:
tr.sort(function(a,b){ console.log('compare', a, b); });
我猜测a
和b
是对象,在这种情况下,使用更大/更小的数据对它们进行排序将毫无意义。
修改强>
要按所单击列的键进行排序,您需要使用从点击处理程序获得的k
属性(我无法验证这一点,但我很确定这是k
是什么 - 与列/属性名称对应的字符串。)
所以,放弃使用d3.ascending并按照以下方式进行排序:
tr.sort(function(a, b) {
return a[k] < b[k] ? -1 : a[k] > b[k] ? 1 : 0;
})
或者,您仍然可以像这样使用d3.ascending:
tr.sort(function(a, b) {
return d3.ascending(a[k], b[k]);
})
原则上没有多大区别。但是,后者的一个好处是它可以更容易地实现一些能让用户控制排序方向(升序与降序)的东西。像这样:
var sortFunction = d3.ascending;
// Instead of the line above, you could write some logic
// to decide whether sortFunction is d3.ascending or d3.descending
// Then you can write:
tr.sort(function(a, b) {
return sortFunction(a[k], b[k]);
})