我有以下代码尝试获取一个单词的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方法呢?
答案 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
不适用于这种情况。使用sum
或ac
或类似的东西。
答案 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"));