Javascript 如何在海图中获得一个点的索引?
我用的是“不规则时间间隔的时间数据”图表。正如您所知,当鼠标移动到线的点上时,formatter函数将运行并显示一些信息。我想知道鼠标在上面移动的点的索引。所以,如果鼠标移动到直线的第一个点上,工具提示显示“1”,第二个点显示“2”,依此类推。thnx.这是一个非常棘手的问题,它的速度会非常慢,有很多积分,但它会起作用。总体思路是查看序列数据中的所有点,直到找到与当前点匹配的点:Javascript 如何在海图中获得一个点的索引?,javascript,highcharts,Javascript,Highcharts,我用的是“不规则时间间隔的时间数据”图表。正如您所知,当鼠标移动到线的点上时,formatter函数将运行并显示一些信息。我想知道鼠标在上面移动的点的索引。所以,如果鼠标移动到直线的第一个点上,工具提示显示“1”,第二个点显示“2”,依此类推。thnx.这是一个非常棘手的问题,它的速度会非常慢,有很多积分,但它会起作用。总体思路是查看序列数据中的所有点,直到找到与当前点匹配的点: tooltip: { formatter: function() { for(var i
tooltip: {
formatter: function() {
for(var i=0;i<this.series.data.length;i++){
var item = this.series.data[i];
if(item.x == this.x && item.y == this.y)
return 'point ' + i;
}
return 'not found'
}
}
工具提示:{
格式化程序:函数(){
对于(var i=0;i而言,一种方法是预处理数据,以包含具有索引的属性。在积雪深度示例中,您可以进行如下准备:
function prepare(dataArray) {
return dataArray.map(function (item, index) {
return {x: item[0], y: item[1], myIndex: index};
});
};
要将[x,y]
的数组转换为类似{x:x,y:y,myIndex:i}
的对象,那么在格式化程序中使用以下命令可以轻松获取该索引:
formatter: function() {
return 'point ' + this.point.myIndex;
}
关于的示例对于记录,您可以用一种很好的方式直接执行
它存储在:
this.points[0].point.x
这在我使用v2.2时起到了作用:
this.series.data.indexOf( this.point )
由于数据已排序,因此可以使用
即使对于大量的点,二进制搜索也应该表现良好(摘自wikipedia文章:“例如,使用线性搜索搜索一百万个项目的列表需要一百万次迭代,但是使用二进制搜索的迭代次数不超过二十次。”
例如:
var bsComparator = function(a, b) {
if (a.x < b.x) { return -1; }
if (a.x > b.x) { return 1; }
return 0;
};
var binarySearch = function(series_data, point) {
var low = 0, high = series_data.length - 1,
i, comparison;
while (low <= high) {
i = Math.floor((low + high) / 2);
comparison = bsComparator(series_data[i], point);
if (comparison < 0) { low = i + 1; continue; }
if (comparison > 0) { high = i - 1; continue; }
return i;
}
return null;
};
tooltip: {
formatter: function() {
var pointIndex = binarySearch(this.series.data, this.point);
return "Point index: " + pointIndex;
}
}
var bsComparator=函数(a,b){
如果(a.xb.x){返回1;}
返回0;
};
var binarySearch=函数(系列数据,点){
var低=0,高=series_数据长度-1,
i、 比较;
while(低0){high=i-1;continue;}
返回i;
}
返回null;
};
工具提示:{
格式化程序:函数(){
var pointIndex=binarySearch(this.series.data,this.point);
返回“点索引:”+点索引;
}
}
(上述binarySearch函数的灵感来源于)听起来您只需要xAxis值(即时间)。使用:
this.xData.indexOf(point.x)
this.points将以更大的系列进行分组,因此需要对点[0]…点[n]进行更深入的搜索。这就是我在Highstock JS v4.2.4上的全部工作:
var index = this.points[0].point.dataGroup.start;
如果您可以访问您的点,那么您可以简单访问,
this.point.index
或干脆this.index
如果this
指的是它自身的点
要访问其索引
在我的例子中,我总是使用它,因为它比@Edgar解决方案更简单,这也很棒。这正是我想要的。但是正如你提到的,这段代码需要花很多时间来执行,特别是当行中满是点的时候。顺便说一句,谢谢。这段代码似乎更快。我会尽快在我的项目中测试它。Thnx eolsson。是的,它应该很快er比搜索索引要快,但会占用更多内存。哇..现在我知道我可以在对象数组中添加除名称、x、y、note之外的更多属性。+1虽然这应该稍微快一点,但@Edgar下面的解决方案更通用。在一些数据不恒定的代码中(例如,如果您正在筛选数据点,有些数据点可能会被删除),索引可能会过时。除非数据集很大,否则速度不应该是一个问题。对我来说也很有用。简单!非常好,简短!!!。尽管我认为您不需要this.point(在括号中),仅此而已这应该是被接受的答案。被接受的答案是一个丑陋的破解。简单明了。谢谢!Edgar的答案似乎是最好的,不需要任何处理。我可以告诉你这被否决的确切原因:因为它依赖于X的内容作为索引。在我的例子中,X是一个日期,所以我得到了日期。但是使用seriesMapping
我将CSV的第三列映射到实际索引,然后使用以下行访问它:)+1