为什么我不能在reduce回调的元素上使用string.charCodeAt()

时间:2019-04-12 12:46:07

标签: javascript arrays string reduce

我有以下代码尝试获取一个单词的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 个答案:

答案 0 :(得分:5)

您犯了两个错误。

  • 您不需要在其charCodeAt(字符代码总和)的数组上应用Number
  • 还将0作为第二个参数传递给reduce(),这将是arr的初始值

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

注意:变量名arr不适用于这种情况。使用sumac或类似的东西。

答案 1 :(得分:5)

您没有正确使用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"));

答案 2 :(得分:1)

如果您未指定 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"));