1

並べ替え関数を使用して、テーブルの行を昇順で並べ替えようとしています。

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が最初のソート可能な行になります。

誰かが問題が何であるかを教えてもらえますか?

4

1 に答える 1

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); });

私はそれを推測していて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]);
})

原則として大した違いはありません。ただし、後者の利点の1つは、ユーザーが並べ替えの方向(昇順と降順)を制御できるようにするものを簡単に実装できることです。このようなもの:

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]);
})
于 2012-10-23T05:30:00.830 に答える