2017-02-11 37 views
0

這是來自「Eloquent JavaScript」書中練習的解決方案代碼。這是代碼是從第5章,它是練習2.如何使用對象表示法來使用JavaScript構建新對象。

我知道byName對象正在通過使用forEach方法構建。我明白這一點。但是,對象括號表示法很難理解,因爲我不知道如何使用本地變量person

在可變differencesfilter方法和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方法中的局部變量personforEach方法的價值。

回答

0

您有對象數組(ancestry)表示Person每個對象。人有一個名爲母親的財產,他/她的母親的名字(這是一個字符串)。

爲了從一個人的母親的名字到代表母親的實際人物對象,您需要創建一個具有人名和值爲人物對象(byName,在forEach中創建)的鍵的地圖。

過濾函數返回一個只能容納實際上有一個有效的母親的人一個新的Array(存在該名稱的綽號註冊表母親對象)。使用[有效的人/媽媽]新對象列表,我們通過採取出生的人財產,減去母親出生的財產(byname[person.mother].born

計算所有這些(map函數)的年齡差距,我希望這並未」噸使事情更加複雜..


該代碼假定祖先是對象的具有該結構的陣列:

[{ 
    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因爲母親財產是無效的。

通過新陣中的地圖功能將循環從過濾器返回只有一個項目「李四」和person.mother的值是「李四」和byName有一個屬性Jane Doe所以byName[person.mother]將返回:

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

您的第一段和第三段很有幫助。但是,我需要澄清你的第二段。當我說'forEach'方法創建了一個連接,指出「jane doe」是「john doe」的母親時,我是否在正確的軌道上?如果是這樣,這是如何做到的?語法'byName [person.name] = person;'仍然令我困惑。 –

相關問題