Почему я не могу использовать string.charCodeAt () в элементах сокращения обратного вызова - PullRequest
1 голос
/ 12 апреля 2019

У меня есть следующий код для попытки получить общую сумму charCodes одного слова. (Зачем мне это не важно для моего вопроса)

function codepoints(string) {
    return string.split("").reduce((arr, next) => arr.charCodeAt(0) + next.charCodeAt(0))
}
console.log(codepoints("abc"));

Но JavaScript выдает мне ошибку:

arr.charCodeAt не является функцией

При запросе типа 'arr' это строка. Но почему я не могу использовать метод charCodeAt на нем?

Ответы [ 3 ]

5 голосов
/ 12 апреля 2019

Вы не используете Array.reduce правильно, первый параметр обратного вызова - это частичный результат или накопитель.

Array.reduce принимает обратный вызов Функция, которая сама принимает еще четыре параметра, в вашем случае вам нужны первые два .

Синтаксис функции reduce: reduce(callback[, initialValue]):

обратный вызов Функция, выполняемая для каждого элемента в массиве, принимая четыре аргумента:

аккумулятор Аккумулятор накапливает возвращаемые значения обратного вызова;это накопленное значение, ранее возвращенное в последнем вызове обратного вызова или initialValue, если оно предоставлено (см. ниже).

currentValue Текущий элемент, обрабатываемый в массиве. **

initialValue Необязательное значение, используемое в качестве первого аргумента для первого вызова обратного вызова.Если начальное значение не указано, будет использован первый элемент в массиве.Вызов метода Reduce () для пустого массива без начального значения является ошибкой.

Чтобы найти сумму, передайте начальное значение 0, а затем добавьте к нему последующие элементы в массиве:

function codepoints(string) {
    return string.split('').reduce( (acc,next) => acc + next.charCodeAt(0), 0)
}

console.log(codepoints("abc"));
5 голосов
/ 12 апреля 2019

Вы делаете две ошибки.

  • Вам не нужно применять charCodeAt к массиву Number (сумма кодов символов).
  • Также передайте 0 в качестве второго аргумента reduce(), который будет начальным значением arr

function codepoints(string) {
    return string.split('').reduce( (arr,next) => arr + next.charCodeAt(0),0)
}
console.log(codepoints("abc"));

Примечание : имя переменной arr не соответствует ситуации. Используйте sum или ac или что-то в этом роде.

1 голос
/ 12 апреля 2019

Если вы не укажете initialValue , когда вызываете Array.reduce, тогда:

  • accumulator будет содержать первый элемент массива на первой итерации
  • accumulator будет содержать накопленные значения на последующих итерациях

В вашем примере вы можете проверить переменную аккумулятора и суммировать соответственно:

function codepoints(string) {
  return string
    .split("")
    .reduce((acc, next) => (typeof acc === "string" ? acc.charCodeAt(0) : acc) + next.charCodeAt(0))
}

console.log(codepoints("abc"));
...