为什么我让 NaN 使用此阵列
Why do I get NaN in working with this array?
我正在尝试用《雄辩的Javascript》一书来改进我的JS。 我正在研究问题 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));
最后两个控制台.log状态返回 NaN。
祖先是一个格式如下的数组:
[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]
未设置的安全措施。
问题就在这里,
return person.born - [person.mother].born
person.born是一个数字和[person.mother] 应该是数组(因为 [])(根据您的定义)。和[person.mother].born也应该是一个数字(根据要求)。所以,你不能使用[person.mother].born,你应该在你的对象中找到"person.mother"键的值。
当你这样做时,
console.log(average(ageDifferences));
方法"average"用于将数字数组作为参数。
由于年龄差异没有数字作为元素,因此它给出了 NaN 错误。
工作演示
NaN
的原因是你试图减去 person.born - person.mother.born,第二个操作数甚至没有退出。所以它是数字 - 未定义。所以你得到了 NaN。
对于已知的母亲,您将其等同于null,这可能不符合所有条件。此外,您还需要更新knownMothers
过滤器。您需要检查此人是否有母亲,以及母亲姓名是否也存在于 byName 对象中。如下所示:
var knownMothers = ancestry.filter(function(person){
return person.mother && byName[person.mother];
});
一旦你这样做了,你将能够得到年龄差异和平均值。
var ancestry = [{
name: "Carolus Haverbeke",
sex: "m",
born: 1832,
died: 1905,
father: "Carel Haverbeke",
mother: "Maria van Brussel"
}, {
name: "Emma de Milliano",
sex: "f",
born: 1876,
died: 1956,
father: "Petrus de Milliano"
}, {
name : "Maria van Brussel",
sex: "m",
born: 1782,
died: 1905,
father: "Carel Haverbeke",
mother: "Maria van"
}];
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 && byName[person.mother];
});
var ageDifferences = knownMothers.map(function(person){
return person.born - byName[person.mother].born;
// assumption: you are trying to get mother's born year from the byName object
});
console.log(knownMothers);
console.log(ageDifferences);
console.log(average(ageDifferences));
- JavaScript NaN equvialence
- 如何为排除无穷大和NaN的数字声明Flow类型
- 为什么我在这个javaScript代码中使用NaN
- 如何防止Math.max()返回NaN
- 使用正则表达式捕获“”并分割成阵列
- AngularJS卡片转盘:将卡片返回到阵列的末尾
- 从不同的对象创建阵列
- 函数将输出nan而不是数字,为什么
- 阵列中随机图像的问题
- 在特定条件下从存储在localStorage中的阵列中删除对象
- jquery中出现NaN错误.已经尝试过ParseInt,但仍然不起作用
- 如何将所有同级存储在动态本地存储阵列中
- 尝试求和时,在我的表的页脚中返回$NaN
- 我的jquery中出现NaN错误
- 从localStorage添加和检索阵列
- 金额结果为NaN
- angular.注射器阵列值未返回当前值
- 流星蒙戈的返回阵列
- 从2D RGB阵列创建图像
- 为什么我让 NaN 使用此阵列