问题描述
我目前正在阅读Marijn Haverbeke撰写的“口才Javascript”,但在理解高阶函数时遇到了困难。
在第5章的“用reduce进行总结”中,他编写了以下代码:
function characterCount(script) {
return script.ranges.reduce((count,[from,to]) => {
return count + (to - from);
},0);
}
console.log(SCRIPTS.reduce((a,b) => {
return characterCount(a) < characterCount(b) ? b : a;
}));
SCRIPTS
的示例:
var SCRIPTS = [
{
name: "Adlam",ranges: [[125184,125259],[125264,125274],[125278,125280]],direction: "rtl",year: 1987,living: true,link: "https://en.wikipedia.org/wiki/Fula_alphabets#Adlam_alphabet"
},{
name: "Caucasian Albanian",ranges: [[66864,66916],[66927,66928]],direction: "ltr",year: 420,living: false,link: "https://en.wikipedia.org/wiki/Caucasian_Albanian_alphabet"
},{
name: "Ahom",ranges: [[71424,71450],[71453,71468],[71472,71488]],year: 1250,link: "https://en.wikipedia.org/wiki/Ahom_alphabet"
}
]
我很难设法解决这个问题。如果不是很麻烦,有人可以通过逐行解释来帮助您吗?非常感谢所有帮助!
谢谢!
解决方法
reduce
适用于Array
,如下所示:arr.reduce(callback( accumulator,currentValue,[,index[,array]] )[,initialValue])
。
SCRIPTS.reduce
返回具有最大characterCount
的对象。
function characterCount
返回script.ranges.reduce
,它返回SCRIPTS.reduce
发送的对象范围之差之和。
与currentValue
一样,它从Array
“创建” ranges
并给出名称:from
和to
,并将它们的区别添加到count
初始化为零(0
)。
我希望这会有所帮助,并且我不会错过任何事情。
请参阅我在问题编辑中添加的代码段。
转换:
function characterCount(script) {
return script.ranges.reduce((count,[from,to]) => {
return count + (to - from);
},0);
}
console.log(SCRIPTS.reduce((a,b) => {
return characterCount(a) < characterCount(b) ? b : a;
}));
使用Array.reduce
定义中的名称,并在更多行中分散显示,以提高可读性:
function characterCount(script) {
return
script.ranges.reduce(
(accumulator,currentValue) => {
return
accumulator + (currentValue[1] - currentValue[0]);
},0
);
}
console.log(
SCRIPTS.reduce(
(accumulator,currentValue) => {
return
characterCount(accumulator) < characterCount(currentValue)
? currentValue
: accumulator;
}
)
);
此外,characterCount(a) < characterCount(b) ? b : a
等于:
if(characterCount(a) < characterCount(b)) b;
else a;