Для начала алфавит:
let alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.split('')
charcode использовать нельзя, потому что в юникоде буква "ё" идет после буквы "я". И это, похоже, навсегда.
Дальше функция, которая определяет "расстояние" между буквами.
function getRange(a, b) {
let iA = alphabet.indexOf(a), iB = alphabet.indexOf(b) // ищем на каких позициях встречаются эти буквы в алфавите
if (iA === -1 || iB === -1) return Infinity // если вообще не встречаются - расстояние бесконечность.
return Math.abs(iA - iB)
}
getRange('а', 'р') // -> 17
getRange('а', 'я') // -> 32
getRange('к', 'в') // -> 9
getRange('а', 'f') // -> Infinity (и никто не мешает добавить английский алфавит)
На основе этой функции не сложно написать сортировку по расстоянию:
function getClosestWord(letter) {
return [...words].sort((word1, word2) => {
return getRange(word1[0], letter) - getRange(word2[0], letter)
})
}
getClosestWord('а') // ->
["аметист", "баржа", "дом", "еж", "креветка", "каток", "кот", "лимон", "море", "морж", "нора", "рога", "рыба", "рак", "сани", "сом", "собака", "том", "танк"]
getClosestWord('п') // ->
["рыба", "рак", "рога", "нора", "собака", "сани", "сом", "танк", "море", "том", "морж", "лимон", "каток", "кот", "креветка", "еж", "дом", "баржа", "аметист"]
Дело за малым - повторять пока не закончатся слова.