d3 sort仅适用于选择行

时间:2012-10-23 03:03:00

标签: javascript html d3.js html-table

我正在尝试使用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行是第一个可排序的行。

有人可以告诉我问题是什么吗?

1 个答案:

答案 0 :(得分:2)

从d3文档中,d3.ascending看起来像这样

function(a, b) {
  return a < b ? -1 : a > b ? 1 : 0;
}

您的案件中ab是什么?您可以通过以下方式进行检查:

tr.sort(function(a,b){ console.log('compare', a, b); });

我猜测ab是对象,在这种情况下,使用更大/更小的数据对它们进行排序将毫无意义。

修改

要按所单击列的键进行排序,您需要使用从点击处理程序获得的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]);
})