如何使用对象表示法通过 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
}
这是 "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
}