Eloquent Javascriptに精通していない限り、このコンテキストは意味をなさない可能性があるという免責事項を追加します。
Eloquent Javascript (第 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"));