d3.scan(iterable[, comparator])
返回数组最小值下标,具体见上一部分。
d3.bisectLeft(array, x[, lo[, hi]])
返回x在数组中的插入点,lo,hi为可选数组范围,默认为整个数组,如果x已经存在返回该值左侧。
d3.bisector(comparator)
d3.bisector(accessor)
这里构造一个平分器,可以向个人构造的对象插入值,获取值的位置。用法如下:
var data = [
{date: new Date(2011, 1, 1), value: 0.5},
{date: new Date(2011, 2, 1), value: 0.6},
{date: new Date(2011, 3, 1), value: 0.7},
{date: new Date(2011, 4, 1), value: 0.8}
];
var bisectDate = d3.bisector(function(d) { return d.date; }).right;
var bisectDate = d3.bisector(function(d, x) { return d.date - x; }).right;
然后可以使用bisectDate(array, date),返回一个下标
import ascending from "./ascending.js";
export default function(compare) {
if (compare.length === 1) compare = ascendingComparator(compare);
return {
left: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) < 0) lo = mid + 1;
else hi = mid;
}
return lo;
},
right: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) > 0) hi = mid;
else lo = mid + 1;
}
return lo;
}
};
}
function ascendingComparator(f) {
return function(d, x) {
return ascending(f(d), x);
};
}
如果传入比较函数参数为1,默认为升序比较。之后将两个函数作为返回值,使用二分查找查x。
d3.bisect(array, x[, lo[, hi]])
import ascending from "./ascending.js";
import bisector from "./bisector.js";
var ascendingBisect = bisector(ascending);
export var bisectRight = ascendingBisect.right;
export var bisectLeft = ascendingBisect.left;
export default bisectRight;
这个是数组的平分器,就是在对象的平分器传入默认升序函数。
d3.ascending(a, b)
d3.descending(a, b)
function ascending(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
function descending(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
升序降序的代码实现,这样写避免很多错误。