Javascript 如果第二个参数为数值,则平分左函数不起作用
在我正在实现的一个小例程中,我使用了d3.js的二分法左函数。 我使用的是最新版本(v5.9.2)。 如果我这样做,一切都很好:Javascript 如果第二个参数为数值,则平分左函数不起作用,javascript,d3.js,Javascript,D3.js,在我正在实现的一个小例程中,我使用了d3.js的二分法左函数。 我使用的是最新版本(v5.9.2)。 如果我这样做,一切都很好: var dataArray = [10, 20, 50, 40, 30, 600]; d3.bisectLeft(dataArray, 30); //2 但如果我这样做,不会: var dataArray = [[10,1],[20,2],[50,5],[40,4],[30,3],[600,60]]; d3.bisectLeft(dataArray, 30); //
var dataArray = [10, 20, 50, 40, 30, 600];
d3.bisectLeft(dataArray, 30); //2
但如果我这样做,不会:
var dataArray = [[10,1],[20,2],[50,5],[40,4],[30,3],[600,60]];
d3.bisectLeft(dataArray, 30); //0 Bad!
然而,这很有效:
var dataArray = [[10,1],[20,2],[50,5],[40,4],[30,3],[600,60]];
d3.bisectLeft(dataArray, '30'); //2 Good!
这是故意的吗?我已经查看了源代码和文档,但我不明白为什么会发生这种情况。
一旦知道这个问题,在我的代码中很容易修复,但我仍然有疑问,我不知道我是否遗漏了什么。这里的问题是你有一个数组。在这种情况下,您必须使用适当的访问器函数,以便D3可以知道要比较的值。根据这些文件,这种方法 使用指定的访问器或比较器函数返回新的平分线。此方法可用于对分对象数组,而不限于基本体的简单数组。(强调矿山) 在您的情况下,这将是:
const bisector = d3.bisector(function(d) { return d[0]; }).left;
如您所见,这将通过在每个内部数组中选取第一个数字,有效地将数组数组转换为单个数字数组,就像问题中的第一个片段一样
另外,请注意数组需要排序这一事实(否则人们永远不会理解为什么2
在您的问题中是“好的”)
这是演示:
var数据数组=[
[10, 1],
[20, 2],
[50, 5],
[40, 4],
[30, 3],
[600, 60]
];
dataArray=dataArray.sort(函数(a,b){
返回a[0]-b[0];
});
常数平分线=d3。平分线(函数(d){
返回d[0];
}).左;
常数结果=平分线(数据数组,30);
console.log(结果)
比我快,回答得好。需要一个警告,说明您正在键入答案以节省时间。@AndrewReid谜团仍然存在:为什么以及如何使用该字符串作为平分线?你可能想调查这一点,并将其作为答案发布。这将修复它。非常感谢。