0

我将添加一个免责声明,除非您熟悉Eloquent Javascript ,否则本文的上下文可能没有意义。

Eloquent Javascript (Chapter 6)的在线版中,我试图理解代码示例 6.3的解释。

该示例专门涵盖了splitParagraph()函数,但是我在代码示例中添加了所有附加函数以使其在本文底部的示例中独立工作,但具体而言,我试图理解作者为什么建议这样做走很长的路要找到字符串的长度。

作者建议使用A)

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

为什么不只使用B)

var end = text.length;

我曾尝试使用B),结果似乎是一样的。我可以弄清楚A)发生了什么,但我不明白这样做有什么意义。

这是完整的代码转储,如果有人复制并粘贴它,我在底部进行了修改以输出它:

function reduce(combine, base, array) {
  forEach(array, function (element) {
    base = combine(base, element);
  });
  return base;
}

function forEach(array, action) {
  for (var i = 0; i < array.length; i++)
    action(array[i]);
}

function map(func, array) {
  var result = [];
  forEach(array, function (element) {
    result.push(func(element));
  });
  return result;
}

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;
}

console.log(splitParagraph("hello world"));
4

1 回答 1

3

使用方法 A在出现{or时断开字符串*。所以 splitParagraph 函数会破坏包含这些字符的文本。

IE

var x = splitParagraph("Hello boy *you're the best* friend {for me}");

x 将包含

[
  { type: "normal", content "hello boy " },
  { type: "emphasised", content "you're the best" },
  { type: "normal", content " friend " },
  { type: "footnote", content "for me" }
]

使用方法 B x 将包含

[
  { type: "normal", content "Hello boy *you're the best* friend {for me}" }
]
于 2012-10-24T08:05:58.090 回答