データのソート
値をソートします。 bisectも参照してください。
ascending(a, b)
例 · ソース · a が b より小さい場合は -1、a が b より大きい場合は 1、a と b が同等の場合は 0、それ以外の場合は NaN を返します。
[39, 21, 1, 104, 22].sort(d3.ascending) // [1, 21, 22, 39, 104]
これは自然順序の比較関数であり、array.sort と組み合わせて要素を昇順に並べることができます。
descending(a, b)
例 · ソース · a が b より大きい場合は -1、a が b より小さい場合は 1、a と b が同等の場合は 0、それ以外の場合は NaN を返します。
[39, 21, 1, 104, 22].sort(d3.descending) // [104, 39, 22, 21, 1]
これは自然順序の比較関数であり、array.sort と組み合わせて要素を降順に並べることができます。
permute(source, keys)
例 · ソース · 指定された keys のイテラブルを使用して、指定された source 配列またはオブジェクトの順列を返します。返される配列には、keys 内の各キーに対して、ソース オブジェクトの対応するプロパティが順番に含まれています。
d3.permute(["a", "b", "c"], [1, 2, 0]) // returns ["b", "c", "a"]
指定された source は配列である必要はありません。たとえば、オブジェクトが与えられた場合
const object = {yield: 27, variety: "Manchuria", year: 1931, site: "University Farm"};
3つのフィールドを次のように抽出できます。
d3.permute(object, ["site", "variety", "yield"]) // ["University Farm", "Manchuria", 27]
quickselect(array, k, lo, hi, compare)
例 · ソース · array[k] が (k - lo + 1) 番目に小さい値となり、array.slice(lo, k) が、指定された compare 関数に従って、k 個の最小の要素となるように、lo と hi (両端を含む) の間の array の要素をインプレースで並べ替え、指定された array を返します。lo が指定されていない場合は 0 がデフォルトになり、hi が指定されていない場合は array.length - 1 がデフォルトになり、compare が指定されていない場合は ascending がデフォルトになります。
たとえば、数値の配列が与えられた場合
const numbers = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];
最小の 8 つの要素を選択するには
d3.quickselect(numbers, 8)
並べ替えられた numbers は
[39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]
// ^^ numbers[k]
numbers[8] は 53 です。先行する k 個の要素よりも大きく、後続の要素よりも小さいです。Volodymyr Agafonkin の quickselect によって実装されています。
reverse(iterable)
ソース · 指定された iterable 内の値を逆順に含む配列を返します。
d3.reverse(new Set([0, 2, 3, 1])) // [1, 3, 2, 0]
array.reverse と同等ですが、指定された入力を変更せず、任意のイテラブルで動作します。
shuffle(array, start, stop)
例 · ソース · Fisher–Yates シャッフルを使用して、指定された array の順序をインプレースでランダム化し、array を返します。
d3.shuffle([..."abcdefg"]) // ["e", "c", "a", "d", "b", "g", "f"], perhaps
start が指定されている場合、シャッフルする array の開始インデックス (両端を含む) になります。start が指定されていない場合は、0 がデフォルトになります。stop が指定されている場合、シャッフルする array の終了インデックス (両端を含まない) になります。stop が指定されていない場合は、array.length がデフォルトになります。たとえば、array の最初の 10 個の要素をシャッフルするには、shuffle(array, 0, 10) を使用します。
shuffler(random)
ソース · 指定されたランダムソースを指定して、シャッフル関数を返します。
d3.shuffler(d3.randomLcg(42))([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) // [5, 3, 7, 6, 8, 9, 1, 4, 0, 2]
決定論的なシャッフルには、d3.randomLcg と共に使用されることがよくあります。
sort(iterable, comparator)
ソース · 指定された comparator または accessor 関数によって定義されたソート順で、指定された iterable 内の値を含む配列を返します。comparator が指定されていない場合は、d3.ascending がデフォルトになります。
d3.sort(new Set([0, 2, 3, 1])) // [0, 1, 2, 3]
accessor (正確に 2 つの引数を取らない関数) が指定されている場合は、
d3.sort(data, (d) => d.value)
自然順序を使用した comparator と同等です。
d3.sort(data, (a, b) => d3.ascending(a.value, b.value))
accessor は要素ごとに 1 回のみ呼び出されるため、アクセサーが非決定的であっても、返されるソート順は一貫しています。複数のアクセサーを指定して、同点解消することができます。
d3.sort(points, ({x}) => x, ({y}) => y)
上記は以下と同等です
d3.sort(data, (a, b) => d3.ascending(a.x, b.x) || d3.ascending(a.y, b.y))
array.sort とは異なり、d3.sort は指定された入力を変更せず、比較関数は辞書順ではなく自然順序をデフォルトとし、入力は任意のイテラブルにすることができます。