我在Eloquent JS的“高阶函数”一章中的“Great-great-great-great -...”示例中苦苦挣扎。我不明白这些功能之一是如何从仅包含祖先数据的对象中创建一个值的。功能如下:
function reduceAncestors(person, f, defaultValue) {
function valueFor(person) {
if (person == null)
return defaultValue;
else
return f(person, valueFor(byName[person.mother]),
valueFor(byName[person.father]));
}
return valueFor(person);
}
和
function sharedDNA(person, fromMother, fromFather) {
if (person.name == "Pauwels van Haverbeke")
return 1;
else
return (fromMother + fromFather) / 2;
}
我不明白valueFor(byName [person.mother])如何从这样的对象生成数值:
"Carolus Haverbeke" : {
"name": "Carolus Haverbeke",
"sex": "m",
"born": 1832,
"died": 1905,
"father": "Carel Haverbeke",
"mother": "Maria van Brussel"}
最佳答案
如果您跳过sharedDNA
的函数声明,则会看到以下内容:
var ph = byName["Philibert Haverbeke"];
console.log(reduceAncestors(ph, sharedDNA, 0) / 4);
如果将其追溯到
reduceAncestors
,则参数映射到:person -> { name: "Philibert Haverbeke", ... },
f -> sharedDNA,
defaultValue -> 0
现在,看看
valueFor()
。它总是返回一个数字,即defaultValue
或sharedDNA
的结果,该结果始终返回一个数字。这是关键:如果一个人没有 parent ,则使用defaultValue
,否则,它会在给定关系之间生成一个sharedDNA的比率,如果该人恰好被命名为“Pauels van Haverbeke,则在第三种情况下为'1' ”。要回答您的问题,“valueFor(...)如何从人员对象生成数字值”,是它仅返回
sharedDNA
递归生成的值。
关于javascript - Great-great-great-great-…示例- Eloquent JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27366010/