跳至内容

数据排序

对值进行排序;另请参见 bisect.

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]

这是自然排序的比较器函数,可与 array.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]

这是自然排序的比较器函数,可与 array.sort 一起使用,以按降序排列元素。

permute(source, keys)

示例 · 源代码 · 使用指定的 keys 可迭代对象返回指定 source 数组或对象的排列。返回的数组包含 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"};

可以像这样提取三个字段

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

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

示例 · 源代码 · 对 arraylohi(含)之间的元素进行就地重新排列,使得 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 洗牌算法 对指定的 array 进行就地随机排序,并返回该 array

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

如果指定了 start,则它是 array 中要进行随机排序的起始索引(含);如果未指定 start,则默认为零。如果指定了 stop,则它是 array 中要进行随机排序的结束索引(不含);如果未指定 stop,则默认为 array.length。例如,要对 array 的前十个元素进行随机排序:shuffle(array, 0, 10)。

shuffler(random)

源代码 · 给定指定的随机源,返回一个 shuffle 函数

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)

源代码 · 返回一个数组,该数组包含给定 iterable 中的值,按给定 comparatoraccessor 函数定义的排序顺序排列。如果未指定 comparator,则默认为 d3.ascending.

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

如果指定了 accessor(一个不接受两个参数的函数),

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

它等同于使用 自然顺序comparator

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

accessor 每个元素只调用一次,因此即使 accessor 非确定性,返回的排序顺序也是一致的。可以指定多个 accessor 来打破平局。

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 不会改变给定的输入,比较器默认为自然顺序而不是词典顺序,并且输入可以是任何可迭代对象。