跳至內容

排序資料

排序值;另請參閱 二分

ascending(a, b)

範例 · 原始碼 · 如果 a 小於 b,傳回 -1;如果 a 大於 b,傳回 1;如果 ab 相等,傳回 0;否則傳回 NaN。

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

這是自然順序的比較器函式,可用於 陣列.sort 以按遞增順序排列元素。

descending(a, b)

範例 · 原始碼 · 如果 a 大於 b,傳回 -1;如果 a 小於 b,傳回 1;如果 ab 相等,傳回 0;否則傳回 NaN。

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

這是自然順序的比較器函式,可用於 陣列.sort 以按遞減順序排列元素。

permute(source, keys)

範例 · 原始碼 · 使用指定的 keys 可迭代物件,傳回指定 source 陣列或物件的排列。傳回的陣列包含 keys 中每個 key 對應的原始物件屬性,依序排列。

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

三個欄位可以這樣萃取

js
d3.permute(object, ["site", "variety", "yield"]) // ["University Farm", "Manchuria", 27]

quickselect(array, k, lo, hi, compare)

範例 · 原始碼 · 在 array 中重新排列 lohi(含)之間的元素,使得 array[k] 為第(k - lo + 1)小的值,而 array.slice(lo, k) 為 k 個最小的元素,根據給定的 compare 函式,並傳回給定的 array。如果未指定 lo,則預設為零;如果未指定 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 隨機化,最後傳回陣列

js
d3.shuffle([..."abcdefg"]) // ["e", "c", "a", "d", "b", "g", "f"], perhaps

如果指定開始,則為陣列要隨機化的開始索引(包含);如果未指定開始,則預設為零。如果指定停止,則為陣列要隨機化的結束索引(不包含);如果未指定停止,則預設為陣列.length。例如,要隨機化陣列的前十個元素:shuffle(陣列, 0, 10)。

shuffler(隨機)

原始碼 · 傳回指定的隨機來源所給予的隨機化函式

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(可迭代, 比較器)

原始碼 · 傳回一個陣列,其中包含給定可迭代中的值,其排序順序由給定的比較器存取器函式定義。如果未指定比較器,則預設為d3.ascending

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

如果指定存取器(一個不完全接受兩個參數的函式),

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

它等於使用自然順序比較器

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

存取器只會針對每個元素呼叫一次,因此傳回的排序順序是一致的,即使存取器是非確定性的。可以指定多個存取器來打破平手。

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

陣列.sort不同,d3.sort不會變異給定的輸入,比較器預設為自然順序,而不是字典順序,而且輸入可以是任何可迭代。