Skip to main content

學習FP的JavaScript基礎

你有一個學生陣列,每位學生都有名字與成績,我們要完成以下幾個任務:

const students = [
{ name: '小美', score: 85 },
{ name: '阿良', score: 42 },
{ name: '小凱', score: 77 },
{ name: '阿珍', score: 59 },
{ name: '小安', score: 91 }
];

任務一:用 map 產生「評語」陣列(陣列方法 + 純函數)

把每位學生都轉換成一句評語:小美的成績是85分,表現不錯喔!

// 請寫出純函數 `getComment(student)`,回傳評語字串
// 然後用 map 建立新陣列 `comments`
const comments = students.map(function ({name, score}){
return `${name}的成績是${score}分,表現不錯喔!`;
});
["小美的成績是85分,表現不錯喔!","阿良的成績是42分,表現不錯喔!","小凱的成績是77分,表現不錯喔!","阿珍的成績是59分,表現不錯喔!","小安的成績是91分,表現不錯喔!"]

任務二:用 filter 過濾不及格的學生

找出所有成績低於 60 分的學生(使用純函數)

// 請寫出純函數 `isFailed(student)`,回傳 true / false
// 然後用 filter 建立新陣列 `failedStudents`
function isFailed(student) {
return student.score < 60;
}
let failedStudents = students.filter(isFailed);
[// [object Object] 
{
"name": "阿良",
"score": 42
},// [object Object]
{
"name": "阿珍",
"score": 59
}]

任務三:用 reduce 計算全班平均成績

// 請用 reduce 算出總分,再除以學生數量,算出平均分數 averageScore
const averageScore = students.reduce((sum,student)=>{
return sum + student.score;
},0);
//354

任務四:製作一個高階函數 makeScoreFilter(minScore)

它會回傳一個函數,幫你篩選成績大於某數字的學生,例如:

// const filterAbove70 = makeScoreFilter(70);
// const goodStudents = students.filter(filterAbove70);
function makeScoreFilter(minScore){
return students.filter(student => student.score > minScore);
}
makeScoreFilter(85);
[// [object Object
{
"name": "小安",
"score": 91
}]

額外挑戰(選擇做)

製作一個純函數 toGrade(score),可以將數字轉為等級

然後幫每位學生加上 grade 欄位,變成這樣:

// { name: '小美', score: 85, grade: 'B' }

function toGrade(score) {
if(score >= 90) return 'A';
if(score >= 80) return 'B';
if(score >= 70) return 'C';
if(score >= 60) return 'D';
return 'F';
}

const studentsWithGrades = students.map(student => {
return {
...student,
grade: toGrade(student.score)
};
});
console.log(studentsWithGrades);
[// [object Object] 
{
"name": "小美",
"score": 85,
"grade": "B"
},// [object Object]
{
"name": "阿良",
"score": 42,
"grade": "F"
},// [object Object]
{
"name": "小凱",
"score": 77,
"grade": "C"
},// [object Object]
{
"name": "阿珍",
"score": 59,
"grade": "F"
},// [object Object]
{
"name": "小安",
"score": 91,
"grade": "A"
}]