D3 平分线不适用于对象数组

d3 bisector not working with array of objects

本文关键字:对象 数组 适用于 不适用 平分线 D3      更新时间:2023-09-26

我有一个对象数组

var s = [{"4":0},{"5":0},{"8":0},{"14":0}];

d3.bisector()

var bd = d3.bisector(function(d,y){ return y;}).left;

这样称呼时

bd(s,5)

它输出0 .如果我使用对象的"键"而不是访问器函数中的值,则平分线将失败。有人可以阐明为什么会发生这种情况吗?

您需要进行两项调整才能使其正常工作:

  1. 若要使用键进行比较,必须显式访问它们。给定你的对象数组,这可以通过d3.keys(d)[0]来完成,从而比较第一个和唯一的键。如果您想对键进行数字比较,这将+d3.keys(d)[0] .

  2. 因为您将回调指定为 function(d,y) {} ,即采用两个参数,因此该函数应是返回布尔值的比较器。在您的情况下,最简单的方法是提供一个单参数回调作为对象键的访问器。

以下代码应按预期工作

s = [{"4":0},{"5":0},{"8":0},{"14":0}];
var bd = d3.bisector(function(d) {
  return +d3.keys(d)[0];
}).left;
console.log(bd(s, 5));   // 1
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>