[英]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對象,您需要創建一個映射,該映射的鍵是人的名字,值是人的對象(byName,在forEach中創建)。
篩選器函數返回一個新的Array,該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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.