问题
我有一个JSON文件。它的一小部分看起来像这样
var ANCESTRY_FILE = "[\n " + [
'{"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", "mother": "Sophia van Damme"}',
'{"name": "Maria de Rycke", "sex": "f", "born": 1683, "died": 1724, "father": "Frederik de Rycke", "mother": "Laurentia van Vlaenderen"}'
我正在阅读的书中的练习要求我区分那些有母亲的人。如果他们有母亲采取他们的年龄差异。为每个人做这件事,然后找出孩子和母亲之间的平均差异。
答案
var ancestry = JSON.parse(ANCESTRY_FILE);
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 differences = ancestry.filter(function(person) {
return byName[person.mother] != null;
}).map(function(person) {
return person.born - byName[person.mother].born;
});
console.log(average(differences));
我的问题
我有两个部分,我很困惑。
1) byName[person.name] = person;
我们为什么要这样做以及它取得了什么成果? byName[person.name]
是什么意思,为什么要存储所有人的条目?
2)
return byName[person.mother] != null;
}).map(function(person) {
return person.born - byName[person.mother].born;
});
据我所知,第一部分是检查一个人是否真的有母亲。但这是怎么回事?只有。如果有人真的有母亲吗?如果有人有母亲会怎么样?
感谢您的帮助。
答案 0 :(得分:3)
在高级别,该代码的作用是:
构建按名称键入的人的地图(例如,将键映射到值的对象)。
过滤人数组,过滤掉person.mother
值不是地图中关键字的人。 (这里有一些挥手。)
映射剩余的条目(未滤除的条目),创建一个年龄差异的新数组。
您的具体问题的详细信息和答案:
1)
byName[person.name] = person;
为什么我们这样做以及它实现了什么?
它在byName
引用的对象中创建一个属性,使用person.name
的值作为属性名称,并将该person对象的引用作为值。
因此,当完成该循环时,byName
是一个“地图”,如果您将在一个人的名字和他们的人物对象之间。
2)
...filter(function(person) { return byName[person.mother] != null; }).map(function(person) { return person.born - byName[person.mother].born; });
据我所知,第一部分是检查一个人是否真的是母亲。
检查byName
是否有一个名称为person.mother
的属性,如果有,则该属性的值是不是 null
或者undefined
。坦率地说,这不是很好的代码。
在JavaScript中,当您获取对象(byName[person.method]
)上的属性值时,如果该对象没有具有该名称的属性,则结果为值undefined
。如果对象 具有该名称的属性,则结果是该属性的值 - (有点令人困惑)也可能是undefined
,或者可能是null
,或其他任何东西。
但是,对于byName
,我们知道它将是undefined
(没有匹配的属性)或人物对象。 undefined != null
为false
,因为在使用宽松等式(==
)时,undefined
和null
彼此相同。任何真实对象引用都会为true
提供!= null
。
filter
所做的是过滤掉person.mother
与byName
中的属性不匹配的条目。
如果有人确实有母亲,那么它是
.map
吗?
正确,filter
的结果是一个新数组,它只包含来自原始数组的条目,其中回调返回了一个真值。
如果有人有母亲会怎么样?
他们完全被排除在最终结果数组之外。