ハイチャートの「不規則な間隔の時間データ」チャートを使用しています。ご存知のように、マウスが線のポイント上を移動すると、フォーマッタ関数が実行され、いくつかの情報が表示されます。マウスがその上を移動するポイントのインデックスを知りたいです。したがって、マウスが線の最初のポイント上を移動すると、ツールチップには「1」が表示され、2番目のポイントには「2」が表示されます。 thnx。
これはv2.2を使用して私のために働いた:
this.series.data.indexOf( this.point )
1つの方法は、データを前処理して、インデックスを持つプロパティを含めることです。 Snow-depthの例では、次のような準備を行うことができます。
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;
}
jsfiddle の例
記録のためにあなたはそれを素晴らしい方法で直接行うことができます
それはで店です:
this.points[0].point.x
ポイントにアクセスできる場合は、簡単にアクセスできます。this.point.index
または単にthis.index
this
が自分自身でインデックスにアクセスするポイントを参照している場合、
私の場合、@ Edgarソリューションよりも単純であるため、常にこれを使用します。これも優れています。
データはソートされているので、 二分探索 を使用できます。
バイナリ検索は、多数のポイントに対してもうまく機能するはずです(ウィキペディアの記事から:「たとえば、100万アイテムのリストを検索するには、線形検索で100万回の反復が必要ですが、バイナリ検索で20回を超えないようにしてください。」
例:
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;
}
}
(上記のbinarySearch関数は http://www.dweebd.com/javascript/binary-search-an-array-in-javascript/ に触発されています)
XAxis値(つまり時間)だけが必要なようです。使用:this.xData.indexOf(point.x)
this.pointsはより大きなシリーズにグループ化されるため、points [0] ... points [n]をさらに詳しく検索する必要があります。
これが、Highstock JSv4.2.4で私のために働いたすべてです。
var index = this.points[0].point.dataGroup.start;
これは、それが来るのと同じくらいハッキーであり、多くのポイントで地獄のように遅くなりますが、それは機能します。一般的な考え方は、現在のポイントに一致するポイントが見つかるまで、シリーズのデータ内のすべてのポイントを調べることです。
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'
}
}