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

时间:2017-02-11 22:45:32

标签: javascript object higher-order-functions

这是“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方法中? person方法和filter方法中的局部变量forEach的值是多少?

1 个答案:

答案 0 :(得分:0)

你有一个对象数组(ancestry),每个对象代表一个Person。人有一个名为母亲的财产,有他/她母亲的名字(这是一个字符串)。

为了从一个人的母亲的名字转到代表母亲的实际人物对象,你需要创建一个地图,其中的关键是人的名字和价值是人物对象(byName,在forEach中创建)。

filter函数返回一个新的Array,它只包含实际拥有有效母版的人(在该名称的byName注册表中有一个母对象)。使用[有效人/母亲]对象的新列表,我们通过获取出生人的财产并减去母亲出生的财产(byname[person.mother].born

来计算所有这些对象的年龄差异(地图功能)

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

该代码假定祖先是具有以下结构的对象数组:

[{
  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,
  }
}

过滤器返回一个新列表:

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

请注意它是如何摆脱Jane Doe因为母公司财产无效。

map函数将遍历从过滤器返回的新数组,只有一个项目' John Doe'并且person.mother具有“Jane Doe”的价值。并且byName有一个属性Jane Doe,因此byName[person.mother]将返回:

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