Javascript D3:什么是平分线?

Javascript D3:什么是平分线?,javascript,arrays,d3.js,Javascript,Arrays,D3.js,我正在研究用D3制作图表,无意中发现了。但是,我不明白它是什么,也不明白它是做什么的 我在网上找到的几乎所有示例都使用日期数组,类似于官方文档中的示例: var数据=[ {日期:新日期(2011,1,1),值:0.5}, {日期:新日期(2011,2,1),值:0.6}, {日期:新日期(2011年3月1日),值:0.7}, {日期:新日期(2011年4月1日),值:0.8} ]; var-bisect=d3.bisector(函数(d){return d.date;}); 那么平分线除了从数

我正在研究用D3制作图表,无意中发现了。但是,我不明白它是什么,也不明白它是做什么的

我在网上找到的几乎所有示例都使用日期数组,类似于官方文档中的示例:

var数据=[
{日期:新日期(2011,1,1),值:0.5},
{日期:新日期(2011,2,1),值:0.6},
{日期:新日期(2011年3月1日),值:0.7},
{日期:新日期(2011年4月1日),值:0.8}
];
var-bisect=d3.bisector(函数(d){return d.date;});
那么平分线除了从数组元素中拾取日期对象外,还做什么呢?
*.right
返回什么

如果我有一个简单的一维数组,比如
var data=[3,6,2,7,5,4,8]
,它有用吗

感谢您给我的启发。

从您链接到的文档:

在数组中找到x的插入点以保持排序顺序

它就是这样做的。它告诉您应该在何处插入新元素,以便在插入新元素之后仍然具有排序数组。数组可以是任何类型的结构,这就是为什么有一个访问器函数,允许您“分解”此结构以进行搜索

左对分和右对分的区别在于插入点的位置(在最近元素的左侧或右侧)——数组的排序是升序还是降序


平分线的一个使用案例是,当将鼠标移动到图形上时,要突出显示最近的数据点,请参见,例如,
bisect
背后的基本思想是:

考虑您提到的数组-
var data=[3,6,2,7,5,4,8]

您想在
数据
数组中插入一个新值,比如说
3.5
,并想知道如何对其进行“分区”。换句话说,您想知道如果在排序
data
array时插入
3.5
的索引会是什么

   var data = [3, 6, 2, 7, 5, 4, 8]

   //Sorted data

  [2, 3, 4, 5, 6, 7, 8]

  //You want to insert 3.5


  The sorted array after insertion of 3.5 should look something like:

  [2, 3, 3.5, 4, 5, 6, 7, 8]


  So the index of 3.5 in sorted data array is "2".
在某些情况下,您可能想知道该元素的插入如何“平分”或“分割”数组。在这种情况下,您需要首先对该数组进行排序,然后执行我们称为a的操作,以找到插入该元素的正确位置

bisectLeft
bisectRight
如果要输入数组中已经存在的元素,请注意澄清异常。假设您想在数组中输入另一个
3
。有两种情况:

   3* -> The new element to be entered


   [2, 3*, 3, 4, 5, 6, 7, 8] -> entered at "1" (array is still sorted)


   [2, 3, 3*, 4, 5, 6, 7, 8] -> entered at "2" (array is still sorted)
因此,根据我们如何处理这种模糊性,我们可以在已经存在的元素的“左”或“右”处输入该元素。从(标记重点)开始:

返回的插入点i将数组分为两半,以便所有v=x表示数组中的v.slice(i,hi)表示右侧

bisecRight
中,我们得到1作为合适的索引,所有重复条目都将位于该索引的右侧,而
bisecRight
中的情况正好相反

既然您知道了
平分左
平分右
是如何工作的,
平分线
只允许我们定义一个自定义的
比较器
访问器
函数来对对象上的值进行划分或理解

所以这段代码:

  var bisect = d3.bisector(function(d) { return d.date; }).right;

  var bisect = d3.bisector(function(a, b) { return a.date - b.date; }).right;
只需指定使用
bisectRight
选项,并返回一个合适的索引,以便在假定数组已排序(按升序)的情况下插入元素

因此,如果我以你的例子为基础,假设一个名为
bisect
bisector
。你做到了:

 bisect(data, 3); //it would return 2.

我希望它能澄清问题,让你朝着正确的方向开始。

回答得很好!我很高兴我终于得到了它!很好的简报。这个链接就是我想要的例子。