3 回答

TA貢獻1801條經驗 獲得超8個贊
在這種情況下,有可能沒有yearOfDeath(如果該人沒有死),您的代碼將檢索undefined并undefined - yearOfBirth給您NaN
任何比較NaN都將false因此您不會進入您的if分支,也不會進入您的else if分支。因此,您不會返回任何東西。如果你else if用一個簡單的替換它,else你會返回一些東西,但它可能是一個錯誤的結果,因為比較是錯誤的。
這就是為什么他們制作了一個函數來檢索當前年份,如果沒有yearOfDeath.
oldestPerson您還需要在函數末尾返回變量。
在您的代碼中,您可以添加如下內容(person.yearOfDeath || currentYear):
let findTheOldest = function(people) {
const currentYear = new Date().getFullYear();
const oldestPerson = people.reduce((winner, person) => {
if (((person.yearOfDeath || currentYear) - person.yearOfBirth) > ((winner.yearOfDeath || currentYear) - winner.yearOfBirth)) {
return person;
} else if (((person.yearOfDeath || currentYear) - person.yearOfBirth) <= ((winner.yearOfDeath || currentYear) - winner.yearOfBirth)) {
return winner;
}
});
return oldestPerson;
}
const p1 = { yearOfBirth: 1990, yearOfDeath: 2015 }
const p2 = { yearOfBirth: 1990 } // Edge case: calculate his age with current year
console.log(findTheOldest([p1, p2]))
現在這段代碼很難閱讀,這就是為什么最好將它拆分成單獨的函數。

TA貢獻1828條經驗 獲得超4個贊
我注意到的幾件事——
當我們不打算重新分配變量時使用
const
(而不是)let
使用初始值(第二個參數)
reduce
來防止數據集為空時程序崩潰使用復合結果會
reduce
阻止我們oldest
在每次迭代中重新計算人的年齡使用默認值可防止空檢查、不必要的變量重新分配,并避免遇到
NaN
. 默認值還向程序員發出函數接受什么類型的數據的信號
const findTheOldest = (people = []) =>
people.reduce
( ([ oldest, oldestAge ], person) => {
const age = getAge(person) // only compute age of current person
return age > oldestAge
? [ person, age ]
: [ oldest, oldestAge ]
}
, [ undefined, -Infinity ] // initial value
)
[0] // reduce returns [ <person>, <age> ], [0] gets the person out
const getAge = ({ yearOfBirth = 0, yearOfDeath = 0 }) =>
yearOfDeath
? yearOfDeath - yearOfBirth
: (new Date).getFullYear() - yearOfBirth
const peeps =
[ { name: "Alice", yearOfBirth: 2000 }
, { name: "Gertrude", yearOfBirth: 1910 }
, { name: "Martha", yearOfBirth: 1900, yearOfDeath: 2006 }
, { name: "Wanda", yearOfBirth: 1940 }
]
// works as expected
console.log(findTheOldest(peeps)) // { name: "Gertrude", ... }
// works when data source is empty
console.log(findTheOldest([])) // undefined
// works when data is missing!
console.log(findTheOldest()) // undefined

TA貢獻1786條經驗 獲得超13個贊
試試這個:
let findTheOldest = function(people) {
const oldestPerson = people.reduce((winner, person) => {
if ((person.yearOfDeath - person.yearOfBirth) > (winner.yearOfDeath - winner.yearOfBirth)) {
return person;
} else if ((person.yearOfDeath - person.yearOfBirth) <= (winner.yearOfDeath - winner.yearOfBirth)) {
return winner;
}
});
return oldestPerson;
}
是一樣的,但我只是在函數末尾添加了 return oldPerson 。告訴我它是否有效
添加回答
舉報