
Fuzzy Ranking
Rank fuzzy matches with rankItem, filter with RankingInfo.passed, compare saved ranking...
Install
npx skills add TanStack/table --skill fuzzy-ranking -g -a claude-code -y- Repository
- TanStack/table28.5k
- Category
- Engineering
- Updated
- 14d ago
- License
- MIT
- Context cost
- Lightabout 726 tokens
- Runs scripts
- No, instructions only
What it does
Rank fuzzy matches with rankItem, filter with RankingInfo.passed, compare saved ranking metadata with compareItems, and configure rankings, thresholds, accessors, min/max bounds, or diacritics. Load for @tanstack/match-sorter-utils itself or fuzzy Table filterMeta wiring.
Setup
<!-- skill-snippet:check -->import { compareItems, rankItem, rankings } from '@tanstack/match-sorter-utils'
const query = 'tan'
const values = ['table', 'tanner', 'router']
export const ranked = values
.map((value) => ({
value,
info: rankItem(value, query, { threshold: rankings.MATCHES }),
}))
.filter((entry) => entry.info.passed)
.sort((a, b) => compareItems(a.info, b.info))
Core Patterns
Separate ranking, filtering, and sorting
Call rankItem once, filter on info.passed, retain the RankingInfo, then order matching results with compareItems.
Rank object fields through accessors
type Person = { name: string; email: string }
const person: Person = { name: 'Ada Lovelace', email: 'ada@example.test' }
const info = rankItem(person, 'lov', {
accessors: [(item) => item.name, (item) => item.email],
})
Accessor options can set a per-accessor threshold plus minRanking/maxRanking bounds.
Store ranking as Table filter metadata
In a Table filterFn, call addMeta?.({ itemRank }). Register the corresponding
meta shape with filterMeta: metaHelper<{ itemRank: RankingInfo }>(). A related
sortFn reads row.columnFiltersMeta[columnId]?.itemRank and uses compareItems,
falling back to an ordinary comparator for ties or absent metadata. For the
primary Table composition, load @tanstack/table-core#table-features and read
its global-filtering reference. Register the fuzzy filter under filterFns
for globalFilterFn: 'fuzzy'.
Common Mistakes
HIGH Numeric rank used as pass flag
Wrong: if (rankItem(value, query).rank) include(value).
Correct: test rankItem(value, query).passed.
Ranks below the configured threshold can still be nonzero; passed records the threshold decision.
Source: TanStack/table:packages/match-sorter-utils/src/index.ts
HIGH Ranking recomputed during sorting
Wrong: call rankItem for both rows on every comparator invocation.
