/
kan64
/
spreadsheet-lab
Обзор
Документация
Войти
/
kan64
/
spreadsheet-lab
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
client/src/utils/gridVisibleRange.ts
85 строк
2 KB
Anton Kravchenkov
perf(ui): Migration table to canvas
20 мар 2026, 22:57
20 мар 2026, 22:57
67c88be
Код
Авторство
О чём код?
import { TOTAL_ROWS } from '../types/types'; /** * Бинарный поиск по префиксам высот строк — O(log n) вместо O(n) при TOTAL_ROWS ~ 1000. */ export function findVisibleRowRange( rowPositions: number[], bodyScrollTop: number, bodyViewH: number ): { startRow: number; endRow: number } { const bodyBottom = bodyScrollTop + bodyViewH; let lo = 0; let hi = TOTAL_ROWS - 1; while (lo < hi) { const mid = (lo + hi) >> 1; if ((rowPositions[mid + 1] ?? 0) <= bodyScrollTop) { lo = mid + 1; } else { hi = mid; } } const startRow = lo; lo = 0; hi = TOTAL_ROWS - 1; let endRow = 0; while (lo <= hi) { const mid = (lo + hi) >> 1; if ((rowPositions[mid] ?? 0) < bodyBottom) { endRow = mid; lo = mid + 1; } else { hi = mid - 1; } } return { startRow, endRow }; } /** * O(log n) по числу столбцов (при бесконечном скролле вправо колонок может быть тысячи). */ export function findVisibleColRange( colPositions: number[], bodyScrollLeft: number, bodyViewW: number, cols: number ): { startCol: number; endCol: number } { if (cols <= 0) return { startCol: 0, endCol: 0 }; const bodyRight = bodyScrollLeft + bodyViewW; let lo = 0; let hi = cols - 1; while (lo < hi) { const mid = (lo + hi) >> 1; if ((colPositions[mid + 1] ?? 0) <= bodyScrollLeft) { lo = mid + 1; } else { hi = mid; } } const startCol = lo; lo = 0; hi = cols - 1; let endCol = 0; while (lo <= hi) { const mid = (lo + hi) >> 1; if ((colPositions[mid] ?? 0) < bodyRight) { endCol = mid; lo = mid + 1; } else { hi = mid - 1; } } return { startCol, endCol }; } export type VisibleRange = { startRow: number; endRow: number; startCol: number; endCol: number }; export function visibleRangeToKey(r: VisibleRange): string { return `${r.startRow}:${r.endRow}:${r.startCol}:${r.endCol}`; }