获取差异母节点(了解代码)

时间:2016-07-05 14:52:46

标签: 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"}'

我正在阅读的书中的练习要求我区分那些有母亲的人。如果他们有母亲采取他们的年龄差异。为每个人做这件事,然后找出孩子和母亲之间的平均差异。

答案

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;
});

据我所知,第一部分是检查一个人是否真的有母亲。但这是怎么回事?只有。如果有人真的有母亲吗?如果有人有母亲会怎么样?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

在高级别,该代码的作用是:

  1. 构建按名称键入的人的地图(例如,将键映射到值的对象)。

  2. 过滤人数组,过滤掉person.mother值不是地图中关键字的人。 (这里有一些挥手。)

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

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

      

    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 != nullfalse,因为在使用宽松等式(==)时,undefinednull彼此相同。任何真实对象引用都会为true提供!= null

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

      

    如果有人确实有母亲,那么它是.map吗?

    正确,filter的结果是一个新数组,它只包含来自原始数组的条目,其中回调返回了一个真值。

      

    如果有人有母亲会怎么样?

    他们完全被排除在最终结果数组之外。