Ответ 1
Это работало для меня, используя v2.2:
this.series.data.indexOf( this.point )
Я использую диаграмму "Временные данные с нерегулярными интервалами" в Highcharts. Как вы знаете, когда мышь перемещается по точкам линии, функция форматирования запускается и отображает некоторую информацию. Я хочу знать индекс точки, над которой движется мышь. Поэтому, если мышь перемещается по первой точке линии, всплывающая подсказка показывает "1", а вторая точка показывает "2" и так далее. Thnx.
Это работало для меня, используя v2.2:
this.series.data.indexOf( this.point )
Один из способов - предварительно обработать данные, чтобы содержать свойство с индексом. В примере с глубиной снега вы можете сделать такой вид:
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
Поскольку данные сортируются, вы можете использовать двоичный поиск .
Бинарный поиск должен хорошо работать даже для большого количества точек (из статьи в википедии: "Например, для поиска списка из миллиона элементов требуется целых миллион итераций с линейным поиском, но никогда больше чем двадцать итераций с бинарным поиском.
Пример:
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 будут сгруппированы в большие ряды, поэтому потребуется более глубокий поиск по точкам [0]... points [n].
Это все, что сработало для меня в Highstock JS v4.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'
}
}
Пример в реальном времени: http://jsfiddle.net/Fuv4h/