我正在尝试通过《Eloquent Javascript》这本书来改进我的 JS。我正在研究 question 5.2 的解决方案并且希望得到一些关于为什么它是错误的并返回 NaN 的解释。我的解决方案是:
function average(array) {
function plus(a, b) { return a + b; }
return array.reduce(plus) / array.length;
}
var byName = {};
ancestry.forEach(function(person) {
byName[person.name] = person;
});
var knownMothers = ancestry.filter(function(person){
return person.mother != null;
});
var ageDifferences = knownMothers.map(function(person){
return person.born - [person.mother].born
});
console.log(knownMothers);
console.log(ageDifferences);
console.log(average(ageDifferences));
最后两个 console.log 状态返回 NaN。
ancestry 是一个格式如下的数组:
[0: {
name: "Carolus Haverbeke"
sex: "m"
born: 1832
died: 1905
father: "Carel Haverbeke"
mother: "Maria van Brussel"
}
1: {
name: "Emma de Milliano"
sex: "f"
born: 1876
died: 1956
father: "Petrus de Milliano"
mother: "Sophia van Damme"
}]
此练习的解决方案位于上面的链接中。它在代码中使用了 byName 对象,因此绕过了输出中的 NaN。有人可以澄清为什么我需要返回 byName 对象内的元素吗?我知道它缺失了一部分,但不知道为什么,但真的很想理解。谢谢你!
我复制了下面的答案(我不太明白)供引用:
var differences = ancestry.filter(function(person) {
return byName[person.mother] != null;
}).map(function(person) {
return person.born - byName[person.mother].born;
});
console.log(average(differences));
最佳答案
我相信您对 ageDifferences
的定义缺少对 byName
的引用。 (并防止 byName[person.mother]
未设置。)
关于javascript - 为什么我在使用这个数组时会得到 NaN ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28906775/