perf(grid): scan all-null columns once

This commit is contained in:
vrustx authored and GitHub committed 2026-07-20 01:24:32 +08:00
1 parent 67df8be6d9
commit 48dc2dee88
2 files changed
+32 -1

No files matched your search

@@ -53,7 +53,22 @@ export function invertedHiddenColumnIndexes(availableIndexes: number[], hiddenIn
export function allNullColumnIndexes(rows: ReadonlyArray<ReadonlyArray<unknown>>, availableIndexes: number[]): number[] {
if (rows.length === 0) return [];
return availableIndexes.filter((index) => rows.every((row) => row[index] === null));
// 单遍行扫描 + 候选原地压缩:列一旦见到非 null 即永久剔除,候选清空提前
// 返回。最坏复杂度同为 O(列×行)(全 null 时无法避免),改进在于常数项:
// 原实现逐列 rows.every 各自从头扫外层 rows 并逐格调用回调,这里每个
// 单元格至多访问一次且无闭包调用
const candidates = [...availableIndexes];
let count = candidates.length;
for (const row of rows) {
let write = 0;
for (let read = 0; read < count; read++) {
if (row[candidates[read]!] === null) candidates[write++] = candidates[read]!;
}
count = write;
if (count === 0) return [];
}
candidates.length = count;
return candidates;
}
export function hiddenColumnIndexesWithAllNullColumns(options: { availableIndexes: number[]; hiddenIndexes: ReadonlySet<number>; allNullIndexes: ReadonlySet<number> }): { hiddenIndexes: Set<number>; autoHiddenIndexes: Set<number> } {