javascript - d3 排序仅适用于选择行

标签 javascript html d3.js html-table

我正在尝试使用排序函数按升序对表中的行进行排序。

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 行是第一个可排序的行。

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

最佳答案

根据 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 属性(我无法验证这一点,但我很确定这就是 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]);
})

关于javascript - d3 排序仅适用于选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13022958/

相关文章:

javascript - 使用索引访问对象属性会给出 undefined

javascript - 在服务器端保存 Canvas 图像时,从 base64 数据字符串生成空白图像

php - 想要添加一列并最终显示结果?

javascript - 如何使用 ajax 调用 javascript 加载新的推特提要

javascript - 附加文本未显示在 d3 v4 中

Javascript 自动化 (OSA) Yosemite : privilege error for certain StandardAddition commands

javascript - 如何从 Flash 导出的 HTML 和 JS 中删除背景图像或颜色

javascript - jquery 生成的 div 标签的随机颜色不是永久的

javascript - D3 select multiple tag- 提取值

d3.js - SVG 元素中的 Latex 数学方程