Javascript 如何在海图中获得一个点的索引?

Javascript 如何在海图中获得一个点的索引?,javascript,highcharts,Javascript,Highcharts,我用的是“不规则时间间隔的时间数据”图表。正如您所知,当鼠标移动到线的点上时,formatter函数将运行并显示一些信息。我想知道鼠标在上面移动的点的索引。所以,如果鼠标移动到直线的第一个点上,工具提示显示“1”,第二个点显示“2”,依此类推。thnx.这是一个非常棘手的问题,它的速度会非常慢,有很多积分,但它会起作用。总体思路是查看序列数据中的所有点,直到找到与当前点匹配的点: tooltip: { formatter: function() { for(var i

我用的是“不规则时间间隔的时间数据”图表。正如您所知,当鼠标移动到线的点上时,formatter函数将运行并显示一些信息。我想知道鼠标在上面移动的点的索引。所以,如果鼠标移动到直线的第一个点上,工具提示显示“1”,第二个点显示“2”,依此类推。thnx.

这是一个非常棘手的问题,它的速度会非常慢,有很多积分,但它会起作用。总体思路是查看序列数据中的所有点,直到找到与当前点匹配的点:

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