javascript - 获取差异母子节点(理解代码)

标签 javascript

问题

我有一个 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?如果有人没有母亲会怎样?

感谢您的帮助。

最佳答案

在高层次上,该代码的作用是:

  1. 构建以姓名为键的人的映射(例如,将键映射到值的对象)。

  2. 过滤人员数组,过滤掉 person.mother 值不是 map 中的键的人员。 (这里有人在挥手。)

  3. 映射剩余条目(未过滤掉的条目),创建一个新的年龄差异数组。

具体问题的详细信息和答案:

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 值的属性,如果有,则该属性的值不是 nullundefined。坦率地说,这不是出色的代码。

在 JavaScript 中,当您获取对象属性的值时 (byName[person.method]),如果该对象没有具有该名称的属性,则结果为值未定义。如果对象确实有一个具有该名称的属性,结果就是该属性的值——(有点令人困惑)也可能是undefined,或者可能是 null,或任何其他内容。

但是,对于 byName,我们知道它要么是 undefined(没有匹配的属性),要么是一个 person 对象。 undefined != nullfalse 因为当使用松散相等 (==) 时,undefinednull 是等价的。对于 != null,任何真实的对象引用都会给出 true

filter 的作用是过滤掉 person.motherbyName 中的属性不匹配的条目。

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/

相关文章:

javascript - 动态创建js数组?

javascript - 循环遍历数组并查找重复数字

javascript - Fullcalendar 可编辑属性不起作用?

php - 通过js重定向和发送变量

javascript倒数计时器每10分钟重新启动一次

javascript - Webpack 中的 "publicPath"有什么作用?

javascript - 模态对话框和表单元素

javascript - 如何在wp8网络浏览器控件中使用javascript加载html?

javascript - MDN构造器属性解释困惑

java - GWT 中的倒计时时钟