雄辩的javascript练习6.3

时间:2014-07-03 09:45:13

标签: javascript

我正在研究Eloquent Javascript本书。我被困在Exercise 6.3

我需要对此行var end = reduce(Math.min, text.length, map(indexOrEnd, ["*", "{"]));进行解释,var结束的目的是什么?顺便说一句,我确实理解减少是如何运作的。

我已经看过其他一些关于它的线索,但回答不多。谢谢。

这是代码 -

function splitParagraph(text) {
  function indexOrEnd(character) {
    var index = text.indexOf(character);
    return index == -1 ? text.length : index;
  }

  function takeNormal() {
    var end = reduce(Math.min, text.length,
                     map(indexOrEnd, ["*", "{"]));
    var part = text.slice(0, end);
    text = text.slice(end);
    return part;
  }

  function takeUpTo(character) {
    var end = text.indexOf(character, 1);
    if (end == -1)
      throw new Error("Missing closing '" + character + "'");
    var part = text.slice(1, end);
    text = text.slice(end + 1);
    return part;
  }

  var fragments = [];

  while (text != "") {
    if (text.charAt(0) == "*")
      fragments.push({type: "emphasised",
                      content: takeUpTo("*")});
    else if (text.charAt(0) == "{")
      fragments.push({type: "footnote",
                      content: takeUpTo("}")});
    else
      fragments.push({type: "normal",
                      content: takeNormal()});
  }
  return fragments;
}

1 个答案:

答案 0 :(得分:0)

映射和缩小的数组只包含两个项目(不是大数字或动态数字),因此我们可以轻松地内联调用:

  reduce(Math.min, text.length, map(indexOrEnd, ["*", "{"]))
= reduce(Math.min, text.length, [indexOrEnd("*"), indexOrEnd("{")])
= Math.min(Math.min(text.length, indexOrEnd("*")), indexOrEnd("{"))
= Math.min(text.length, indexOrEnd("*"), indexOrEnd("{"))

因此,end将是第一次出现*{个字符的索引,如果没有出现,则为文本的结尾。