【问题标题】:d3 sort only applies to select rowsd3 sort 仅适用于选择行
【发布时间】:2014-01-07 13:50:07
【问题描述】:

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

谁能告诉我问题出在哪里?

【问题讨论】:

  • 您能否创建一个 jsfiddle(或至少发布您的数据和所有代码)以便更轻松地找出问题所在?
  • 这是代码:jsfiddle.net/rkr2/Ba8D8data: name,bh,md,sp,bm AL,152,10,7,0 AO,82,9,8.5,-1 AP,481,11,7.5,0.8387097 BE,14,-1,8.8,0.5806451 DI,14,13,7.7,0.4285714 EC,801,-1,7.7,0.9032258 ED,-1,-1,8.2,0.5517241 EF,-1,9,8.8,0 EM,723,7,7.2,-1 JF,-1,4,9.5,0 KGS,111,15,6.6,0 KS,-1,15,8.8,0 MM,-1,8,7.2,0 MO,439,12,8,0.6774194 PC,27,-1,8.4,-1 PO,0,12,8.8,0.5806451 TL,2312,6,9.2,-1 VM,-1,9,6.6,0

标签: javascript html d3.js html-table


【解决方案1】:

从 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 是对象,在这种情况下,用大于/小于-than 对它们进行排序是没有意义的。

编辑:

要按被点击的列的键排序,您需要使用从点击处理程序获得的k 属性(我无法验证这一点,但我很确定这就是@ 987654329@ 是 - 对应于列/属性名称的字符串。

所以,放弃使用 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]);
})

【讨论】:

  • 就是你说的Amit,a和b以及行的对象,列名和值的键值对。我可以根据单击的列传递值吗? (即按列排序)
  • 感谢您的解释!它正在工作,但排序以我无法理解的方式完成。一些较小的值出现在较大的值之后。此外,多次单击同一列会导致某些行子集的某种重新排列。 (而不是在第一次点击后保持排序)。知道什么会导致这种行为吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-31
  • 2021-05-13
  • 2016-09-09
  • 1970-01-01
  • 2016-01-10
  • 2014-05-29
  • 2013-07-16
  • 2017-09-12
相关资源
最近更新 更多