私は、Mike Bostock のクロスフィルター ライブラリを使用して、大きなデータセットをフィルター処理および並べ替えています。私の問題:複数の次元を持つデータセットが与えられた場合、一度に複数の次元で並べ替えるにはどうすればよいですか?
テスト データセット:
[
{ cat: "A", val:1 },
{ cat: "B", val:2 },
{ cat: "A", val:11 },
{ cat: "B", val:5 },
{ cat: "A", val:3 },
{ cat: "B", val:2 },
{ cat: "A", val:11 },
{ cat: "B", val:100 }
]
必要な出力の例、並べ替えcat, val
(昇順):
[
{ cat: "A", val:1 },
{ cat: "A", val:3 },
{ cat: "A", val:11 },
{ cat: "A", val:11 },
{ cat: "B", val:2 },
{ cat: "B", val:2 },
{ cat: "B", val:5 },
{ cat: "B", val:100 }
]
これまでに使用したアプローチは、目的の次元で文字列連結を使用することです。
var combos = cf.dimension(function(d) { return d.cat + '|' + d.val; });
これは、複数の文字列ベースのディメンションでは正常に機能しますが、自然な並べ替えではないため、数値ディメンションでは機能しません ( '4' > '11'
)。数字をゼロで埋めることでこれを機能させることができると思いますが、これは大規模なデータセットでは費用がかかる可能性があるため、避けたいと思います。クロスフィルターを使用して、ここで機能する別の方法はありますか?
さまざまなディメンションにさまざまな並べ替え方向 (昇順/降順) を許可するソリューションのボーナス ポイント。
明確化: はい、ネイティブArray.sort
実装に切り替える必要があるかもしれません。しかし、クロスフィルターを使用することの要点は、特に大規模なデータセットの場合に非常に高速であり、並べ替えの繰り返しをさらに高速にする方法で並べ替え順序をキャッシュすることです。だから私はここでクロスフィルターベースの答えを本当に探しています。