Вы можете получить доступ к значениям оси X через g.getValue(row, 0)
.Исходя из этого, вы можете выполнить линейное сканирование, чтобы найти первую строку в диапазоне, или (причудливее, но быстрее) использовать двоичный поиск.
Вот способ выполнить линейное сканирование:
const [x1, x2] = g.xAxisRange();
let letRow = null, highRow = null;
for (let i = 0; i < g.numRows(); i++) {
if (g.getValue(i, 0) >= x1) {
lowRow = i;
break;
}
}
for (let i = g.numRows() - 1; i >= 0; i--) {
if (g.getValue(i, 0) <= x2) {
highRow = i;
break;
}
}
const dataX1 = g.getValue(lowRow, 0);
const dataX2 = g.getValue(highRow, 0);
Для больших наборов данных вы можете выполнить бинарный поиск, используя что-то вроде lodash _.sortedIndex
.
Обновление Вот реализация бинарного поиска.Никаких обещаний о точном поведении границ (то есть, всегда ли он возвращает индексы, которые находятся внутри видимого диапазона, или индексы, которые содержат видимый диапазон).
function dygraphBinarySearch(g, x) {
let low = 0;
let high = g.numRows() - 1;
while (high > low) {
let i = Math.floor(low + (high - low) / 2);
const xi = g.getValue(i, 0);
if (xi < x) {
low = i + 1;
} else if (xi > x) {
high = i - 1;
} else {
return i;
}
}
return low;
}
function getVisibleDataRange(g) {
const [x1, x2] = g.xAxisRange();
let lowI = dygraphBinarySearch(g, x1);
let highI = dygraphBinarySearch(g, x2);
return [lowI, highI];
}