雄辩的JavaScript第5章中的“减少”概述

问题描述

我目前正在阅读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"
  }
]

我很难设法解决这个问题。如果不是很麻烦,有人可以通过逐行解释来帮助您吗?非常感谢所有帮助!

谢谢!


var SCRIPTS = [
  {
    name: "Adlam",link: "https://en.wikipedia.org/wiki/Ahom_alphabet"
  }
]

function characterCount(script) {
  return script.ranges.reduce((count,b) => {
  return characterCount(a) < characterCount(b) ? b : a;
}));

解决方法

reduce适用于Array,如下所示:
arr.reduce(callback( accumulator,currentValue,[,index[,array]] )[,initialValue])

SCRIPTS.reduce返回具有最大characterCount的对象。

function characterCount返回script.ranges.reduce,它返回SCRIPTS.reduce发送的对象范围之差之和。
currentValue一样,它从Array“创建” ranges并给出名称:fromto,并将它们的区别添加到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;

并且是Conditional (ternary) operator