コンテンツへスキップ

データのソート

値をソートします。 bisectも参照してください。

ascending(a, b)

· ソース · ab より小さい場合は -1、ab より大きい場合は 1、ab が同等の場合は 0、それ以外の場合は NaN を返します。

js
[39, 21, 1, 104, 22].sort(d3.ascending) // [1, 21, 22, 39, 104]

これは自然順序の比較関数であり、array.sort と組み合わせて要素を昇順に並べることができます。

descending(a, b)

· ソース · ab より大きい場合は -1、ab より小さい場合は 1、ab が同等の場合は 0、それ以外の場合は NaN を返します。

js
[39, 21, 1, 104, 22].sort(d3.descending) // [104, 39, 22, 21, 1]

これは自然順序の比較関数であり、array.sort と組み合わせて要素を降順に並べることができます。

permute(source, keys)

· ソース · 指定された keys のイテラブルを使用して、指定された source 配列またはオブジェクトの順列を返します。返される配列には、keys 内の各キーに対して、ソース オブジェクトの対応するプロパティが順番に含まれています。

js
d3.permute(["a", "b", "c"], [1, 2, 0]) // returns ["b", "c", "a"]

指定された source は配列である必要はありません。たとえば、オブジェクトが与えられた場合

js
const object = {yield: 27, variety: "Manchuria", year: 1931, site: "University Farm"};

3つのフィールドを次のように抽出できます。

js
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 個の最小の要素となるように、lohi (両端を含む) の間の array の要素をインプレースで並べ替え、指定された array を返します。lo が指定されていない場合は 0 がデフォルトになり、hi が指定されていない場合は array.length - 1 がデフォルトになり、compare が指定されていない場合は ascending がデフォルトになります。

たとえば、数値の配列が与えられた場合

js
const numbers = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];

最小の 8 つの要素を選択するには

js
d3.quickselect(numbers, 8)

並べ替えられた numbers

js
[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 内の値を逆順に含む配列を返します。

js
d3.reverse(new Set([0, 2, 3, 1])) // [1, 3, 2, 0]

array.reverse と同等ですが、指定された入力を変更せず、任意のイテラブルで動作します。

shuffle(array, start, stop)

· ソース · Fisher–Yates シャッフルを使用して、指定された array の順序をインプレースでランダム化し、array を返します。

js
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)

ソース · 指定されたランダムソースを指定して、シャッフル関数を返します。

js
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 がデフォルトになります。

js
d3.sort(new Set([0, 2, 3, 1])) // [0, 1, 2, 3]

accessor (正確に 2 つの引数を取らない関数) が指定されている場合は、

js
d3.sort(data, (d) => d.value)

自然順序を使用した comparator と同等です。

js
d3.sort(data, (a, b) => d3.ascending(a.value, b.value))

accessor は要素ごとに 1 回のみ呼び出されるため、アクセサーが非決定的であっても、返されるソート順は一貫しています。複数のアクセサーを指定して、同点解消することができます。

js
d3.sort(points, ({x}) => x, ({y}) => y)

上記は以下と同等です

js
d3.sort(data, (a, b) => d3.ascending(a.x, b.x) || d3.ascending(a.y, b.y))

array.sort とは異なり、d3.sort は指定された入力を変更せず、比較関数は辞書順ではなく自然順序をデフォルトとし、入力は任意のイテラブルにすることができます。