Вы можете использовать map
и reduce
, чтобы получить значение каждого слова. Вы также можете сохранить индекс слова рядом со значением, а затем отсортировать значения от наименьшего к наименьшему, а затем напрямую получить доступ к наибольшему значению с помощью [0], а слово - по индексу [1].
let testStr = 'man i need a taxi up to ubud'
const values = [...Array(27).keys()]
values.shift()
const keys = String.fromCharCode(...[...Array('z'.charCodeAt(0) - 'a'.charCodeAt(0) + 1).keys()]
.map(i => i + 'a'.charCodeAt(0)))
const merged = [...keys].reduce((obj, key, index) => ({ ...obj, [key]: values[index] }), {})
console.log(
testStr.split(' ')
.map(w => [w.split('').reduce((a, l) => (a += merged[l] || 0), 0), w])
.sort(([a], [b]) => b - a)[0][1]
)
Затем вы можете превратить это в полезную функцию:
const values = [...Array(27).keys()]
values.shift()
const map = [...String.fromCharCode(...[...Array('z'.charCodeAt(0) - 'a'.charCodeAt(0) + 1).keys()]
.map(i => i + 'a'.charCodeAt(0)))].reduce((obj, key, index) => ({ ...obj, [key]: values[index]}), {})
const getHighest = s => (
s.toLowerCase()
.split(' ')
.map((w, i) => [w.split('').reduce((a, l) => (a += map[l] || 0), 0), w])
.sort(([a], [b]) => b - a)[0][1]
)
console.log(getHighest('man i need a taxi up to ubud'))
console.log(getHighest('This is a test'))
Однако проще и короче писать при получении значения во время цикла, а не на карте заранее:
const getHighest = s => (
s.toLowerCase()
.split(' ')
.map((w, i) => [w.split('').reduce((a, l) => (a += l.charCodeAt() || 0), 0), w])
.sort(([a], [b]) => b - a)[0][1]
)
console.log(getHighest('man i need a taxi up to ubud'))
console.log(getHighest('This is a test'))