问题
我有一个 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"}'
我正在阅读的书中的练习要求我了解那些有母亲的人之间的区别。如果他们有母亲,请考虑他们的年龄差异。对每个人都这样做,然后找出 child 和母亲之间差异的平均值。
答案
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;
});
据我了解,第一部分是检查一个人是否真的有母亲。但是这是怎么运行的呢?如果某人确实有母亲,它是否只使用 .map?如果有人没有母亲会怎样?
感谢您的帮助。
最佳答案
在高层次上,该代码的作用是:
构建以姓名为键的人的映射(例如,将键映射到值的对象)。
过滤人员数组,过滤掉
person.mother
值不是 map 中的键的人员。 (这里有人在挥手。)映射剩余条目(未过滤掉的条目),创建一个新的年龄差异数组。
具体问题的详细信息和答案:
1)
byName[person.name] = person;
Why exactly are we doing this and what is it achieving?
它在 byName
引用的对象中创建一个属性,使用 person.name
的值作为属性名称,并将对该 person 对象的引用作为值。
因此,当该循环完成时,byName
是一个“映射”,如果您在一个人的名字和他们的人对象之间。
2)
...filter(function(person) { return byName[person.mother] != null; }).map(function(person) { return person.born - byName[person.mother].born; });
To my understanding the first part is checking whether or not a person actually HAS a mother or not.
它正在检查 byName
是否有名称为 person.mother
值的属性,如果有,则该属性的值不是 null
或 undefined
。坦率地说,这不是出色的代码。
在 JavaScript 中,当您获取对象属性的值时 (byName[person.method]
),如果该对象没有具有该名称的属性,则结果为值未定义
。如果对象确实有一个具有该名称的属性,结果就是该属性的值——(有点令人困惑)也可能是undefined
,或者可能是 null
,或任何其他内容。
但是,对于 byName
,我们知道它要么是 undefined
(没有匹配的属性),要么是一个 person 对象。 undefined != null
是 false
因为当使用松散相等 (==
) 时,undefined
和 null
是等价的。对于 != null
,任何真实的对象引用都会给出 true
。
filter
的作用是过滤掉 person.mother
与 byName
中的属性不匹配的条目。
Does it only
.map
if someone actually has a mother?
正确,filter
的结果是一个新数组,其中仅包含原始数组中回调返回真值的条目。
What happens if someone doesent have a mother?
它们完全被排除在最终结果数组之外。
关于javascript - 获取差异母子节点(理解代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38206580/