/** * Группирует объекты по первой латинской букве указанного поля; нелатинские и нелитерные * символы (цифры, кириллица) попадают под ключ `#`. Группы отсортированы по алфавиту, `#` в конце. * @param items - массив объектов * @param field - поле для группировки (по умолчанию `title`) */ export function groupByFirstLetter>( items: T[], field = 'title', ): Record { const groups: Record = {}; for (const item of items) { const firstChar = String(item[field] ?? '')[0]?.toUpperCase() ?? '#'; const key = /[A-Z]/.test(firstChar) ? firstChar : '#'; if (!groups[key]) groups[key] = []; groups[key].push(item); } return Object.fromEntries( Object.entries(groups).sort(([a], [b]) => { if (a === '#') return 1; if (b === '#') return -1; return a.localeCompare(b); }), ); }