---
tags: JS - 練習
---
# 【Reduce】 練習
> https://w3c.hexschool.com/blog/a2cb755f
:::warning
每個元素都會呼叫回調函式(callback),可傳入四個參數:
accumulator:累加器
currentValue:當前元素
currentIndex:當前元素的索引(選擇性)
array: 呼叫 reduce() 方法的陣列(選擇性)
設定初始值:
initialValue:第一次呼叫時要傳入的累加器初始值。(選擇性)
若沒有提供初始值,則原陣列的第一個元素將會被當作初始的累加器。
### Reduce
//有給預設值
const arr = [1, 2, 3, 4, 5];
const reduceArr = arr.reduce((accumulator, currentValue) => {
return accumulator + currentValu;
});
console.log(reduceArr); // 15
//沒有給預設值
const arr = [1, 2, 3, 4, 5];
const reduceArr = arr.reduce((accumulator, currentValue) => {
console.log(accumulator); // 1, 3, 6, 10
console.log(currentValue); // 2, 3, 4, 5
return accumulator + currentValue;
});
:::
> 請用下列資料,data為學校資料:
```
const data = [
{
class: '甲',
studentsNum: '12',
studentsData: [
{ id: 1, name: '陳小名', age: 24, interest: ['打球', '聽音樂'] },
{ id: 2, name: '王大偉', age: 24, interest: ['聽音樂', '唱歌', '看書'] },
{ id: 3, name: '許世斌', age: 23, interest: ['唱歌', '聽音樂'] },
{ id: 4, name: '吳添財', age: 24, interest: ['打球', '聽音樂'] },
{ id: 5, name: '曾無傭', age: 24, interest: ['打球'] },
{ id: 6, name: '陳漢霖', age: 24, interest: ['喝酒', '唱歌', '看書'] },
{ id: 7, name: '楊世博', age: 30, interest: ['聽音樂', '看書'] },
{ id: 8, name: '楊漢鎮', age: 30, interest: ['看書', '唱歌'] },
{ id: 9, name: '楊采媗', age: 30, interest: ['打球', '唱歌'] },
{ id: 10, name: '詹天明', age: 30, interest: ['唱歌', '看書'] },
{ id: 11, name: '楊是崁', age: 30, interest: ['看書'] },
{ id: 12, name: '楊安浪', age: 24, interest: ['聽音樂', '唱歌', '看書'] }
]
},
{
class: '乙',
studentsNum: '5',
studentsData: [
{ id: 1, name: '蔡申明', age: 50, interest: ['打球', '唱歌', '看書'] },
{ id: 2, name: '蔡文旯', age: 51, interest: ['唱歌', '看書'] },
{ id: 3, name: '陳炘採', age: 58, interest: ['打球'] },
{ id: 4, name: '昂天次', age: 56, interest: ['聽音樂', '唱歌', '看書'] },
{ id: 5, name: '王銘感', age: 58, interest: ['聽音樂'] }
]
},
{
class: '丙',
studentsNum: '6',
studentsData: [
{ id: 1, name: '林赤子', age: 18, interest: ['唱歌'] },
{ id: 2, name: '林小優', age: 24, interest: ['聽音樂', '唱歌', '看書'] },
{ id: 3, name: '陳問鼎', age: 23, interest: ['打球', '唱歌', '看書'] },
{ id: 4, name: '陳字字', age: 25, interest: ['打球', '唱歌', '聽音樂'] },
{ id: 5, name: '陳余文', age: 66, interest: ['聽音樂', '唱歌', '看書'] },
{ id: 6, name: '楊蔡文', age: 17, interest: ['打球', '聽音樂'] }
]
}
]
```
### Reduce 題目:
:::info
請將甲班的同學名子整理出來放在一個陣列
例如: ['林小明', '詹雲逞']
:::
:::info
請將甲班的studentsData整理成只有ID,乙班整理成只有name,丙班添加一個身高(height)資料進去
:::
:::info
請將每個班級的班級和數量裝成物件,並將studentsNum的KEY命名為num,並存成陣列返回
例如: [{ class: '甲', num: '10' }...]
:::
### 補充練習 題目 (不限制方法,但必須最少用一次Reduce操作):
:::info
請統計出該學校中姓"陳"的同學,並將甲班姓"陳"的同學排除
:::
:::info
請將該學校中學生的興趣整理出來,並存成一個陣列,陣列中的興趣不能重複
例如: ['聽音樂', '唱歌', '看書', '打球', '喝酒']
:::
:::info
請將甲班同學按照年齡排序,並將學生資料傳出,且檢查排序結果是否有問題
:::
<!-- function bubble(ary) {
for(var i=0;i<ary.length;i++) {
for(var j=0;j<ary.length - i - 1;j++) {
if (ary[j].age > ary[j+1].age) {
var temp = ary[j];
ary[j] = ary[j+1];
ary[j+1] = temp;
}
}
}
return ary
} -->