如何使用对象表示法通过 JavaScript 构建新对象。

How to use object notation to build a new object with JavaScript.

这是 "Eloquent JavaScript" 书中练习的解决方案代码。这是第 5 章的代码,是练习 2。

我知道 byName 对象正在使用 forEach 方法构建。我明白这一点。但是,对象括号表示法很难理解,因为我不知道如何使用局部变量person

在变量 differences 中,正在使用 filter 方法和 map 方法,我了解它们的使用方式。但是我不知道局部变量 person 的值,也不知道 byName 对象是如何被使用的。

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));
// 31.2

byName 对象如何合并到 filter 方法和 forEach 方法中? filter方法和forEach方法中局部变量person的值是多少。

您有一个对象数组 (ancestry),每个对象代表一个 Person。 Person 有一个 属性 叫妈妈的 his/her 妈妈的名字(这是一个字符串)。

为了从一个人的母亲的名字到代表母亲的实际人物对象,您需要创建一个映射,其中的键是人的名字,值是人物对象(byName,在 forEach 中创建)。

过滤器函数 return 是一个新数组,它只包含实际拥有有效母亲的人(在 byName 注册表中有一个对应于该名称的母亲对象)。使用新列表 [有效 person/mother] 对象,我们计算所有对象的年龄差异(映射函数),方法是取出生 属性 的人并减去出生 属性 的母亲(byname[person.mother].born)

我希望这不会让事情变得更复杂..


代码假定 ancestry 是一个具有以下结构的对象数组:

[{
  name: 'John Doe'
  born: 2,
  mother: 'Jane Doe'
},
{
  name: 'Jane Doe'
  born: 1,
  mother: null
}]

并且在 forEach 具有 运行 byName 之后将是:

{
  'John Doe': {
    name: 'John Doe',
    born: 2,
    mother: 'Jane Doe'
  },
  'Jane Doe': {
    name: 'Jane Doe',
    born: 1,
    mother: null,
  }
}

过滤器 return 是一个新列表:

[{
  name: 'John Doe',
  born: 2,
  mother: 'Jane Doe'
}]

注意它是如何去掉 Jane Doe 因为母亲 属性 无效。

map 函数将循环遍历新数组 return 从只有一项 'John Doe' 和 person.mother 的过滤器中编辑,其值为 'Jane Doe' 和 byName 有一个 属性 Jane Doe 所以 byName[person.mother] 将 return the:

{
  name: 'Jane Doe',
  born: 1,
  mother: null
}