这是“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
的值是多少?
答案 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
}