Как вы используете объект словаря для сравнения ключей данного массива в Javascript? - PullRequest
0 голосов
/ 08 ноября 2019

Я делаю вызов кода, в котором я хочу найти слово «наибольшее значение» в строке слов. Я назначил символы «az» в качестве ключей и цифры «1-26» в качестве значений в моем объекте. Мне интересно, есть ли способ сравнить буквы в словах данной строки с моим объектом словаря и начать складывать значения букв, чтобы найти слово «наибольшее значение». Вот мой объект словаря:

let testStr = 'man i need a taxi up to ubud'
testStr.split(' ')
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(JSON.stringify(merged) + '\n' + testStr)

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вы можете использовать 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'))
0 голосов
/ 08 ноября 2019

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(JSON.stringify(merged) + '\n' + testStr)


const result = testStr.split(' ')
  .reduce((acc, cur) => [
    ...acc, 
    {
      name: cur,
      value: [...cur].reduce((sum, c) => sum + merged[c], 0)
    }
  ], [])
  .reduce((prev, current) => (prev.value > current.value) ? prev : current)
  .name;

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...