請啟用 Javascript 查看內容

JS 學徒特訓班 - JS 函式 24 ~ 35 關

 ·  ☕ 5 分鐘

竹白的 JS 學徒特訓班筆記 - 目錄

記錄六角學院所開的 JS 學徒特訓班,為期 60天的特訓。

第二十四關:資料格式處理,forEach + 陣列處理(一)

題目連結

劇情略。

24. 題目

以下是預期希望出現正常的圖表,請改寫此 Codepen,並在 Slack 回傳你的解法:
PS:HTML 與 CSS 面板壞掉了,只能變更 JS 面板

24. 參考解答

1
2
3
newMonthMoney.forEach((item)=> {
  monthMoney.push(item);
});

第二十五關:資料格式處理,forEach + 陣列處理(二)

題目連結

劇情略。

25. 題目

以下是預期希望出現正常的圖表,請改寫此 Codepen,並在 Slack 回傳你的解法:
PS:HTML 與 CSS 面板壞掉了,只能變更 JS 面板

25. 參考解答

1
2
3
4
serverData.forEach((item)=> {
  let temp = [item.name, ...item.seasonOneData, ...item.seasonTwoData];
  data.push(temp);
});

教學、延伸知識連結

第二十六關:AJAX、axios 題目

題目連結

26. 問題

觀看 JS 新手教學 - AJAX 與資料處理,試著撈出 API 所有的姓名列表。

https://raw.githubusercontent.com/hexschool/hexschoolNewbieJS/master/data.json

26. 參考解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const urlAPI = 'https://raw.githubusercontent.com/hexschool/hexschoolNewbieJS/master/data.json';

let data = [];

axios.get(urlAPI).then((res) => {
  data = res.data; // 取得資料
  rander(data); // 渲染
});

function rander(arr) {
  let html = '';
  arr.forEach((item)=> {
    html += `<li>${item.name}</li>`
  });
  document.querySelector('.list').innerHTML = html;
}

教學、延伸知識連結

第二十七關:陣列補充觀念

題目連結

27. 問題

請從以下連結,學習 2~3 種陣列的處理方式,聽說 sort 就蠻常見的,並在 slack 回報自己的範例程式碼與學到的東西。

27. 參考解答

我以前的筆記:

第二十八關:陣列排序進度

題目連結

28. 問題

API:

https://raw.githubusercontent.com/hexschool/hexschoolNewbieJS/master/data.json

撈出資料後,依照每個物件的 process 來進行進度排序,範例格式如下圖。

<ul>
 <li>第 1 名是廖洧杰,他的特訓班完成度是 33%</li>
 <li>第 2 名是王小明,他的特訓班完成度是 30%</li>
</ul>

28. 參考解答

process 資料格式為字串、數字部分為浮點數、單位為 %,因此若直接使用 parseInt() 取得數字,只能取得整數部分,小數部分就會有誤差,因此可以使用 parseFloat()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const urlAPI = 'https://raw.githubusercontent.com/hexschool/hexschoolNewbieJS/master/data.json';

let data = [];

axios.get(urlAPI).then((res) => {
  data = res.data; // 取得資料
  let sortedData = sortData(data); // 排序
  rander(sortedData); // 渲染
});

function rander(arr) {
  let html = '';
  arr.forEach((item, index)=> {
    html += `<li>第 ${index + 1} 名是${item.name},他的特訓班完成度是 ${item.process}</li>`
  });
  document.querySelector('.list').innerHTML = html;
}

function sortData(arr) {
  let temp = [...arr]; // 複製一份避免動到原始資料
  temp.sort((a, b)=> parseFloat(b.process) - parseFloat(a.process));
  return temp;
}

教學、延伸知識連結

第二十九關:監聽切換排序功能

題目連結

29. 問題

承接上題,新增切換排序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<select>
 <option value="id">依照 id 編號排序(由1開始從上往下)</option>
 <option value="process">依照完課率排序(由最高到最低)</option>
</select>

// 以下為編號排序範例
<ul class="list">
 <li>編號 ID 1 為廖洧杰,他的完成進度為 5 %</li>
 <li>編號 ID 2 為王小明,他的完成進度為 33 %</li>
</ul>

// 以下為完課率排序範例
<ul class="list">
 <li>編號 ID 2 為王小明,他的完成進度為 33 %</li>
 <li>編號 ID 1 為廖洧杰,他的完成進度為 5 %</li>
</ul>

29. 參考解答

監聽 <select> 取得 <option> 的值,用來判斷排序方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
let selectDom = document.getElementById('select');

selectDom.addEventListener('change', function() {
  let sortedData = sortData(data, this.value);
  rander(sortedData);
});

function sortData(arr, mode = 'id') {
  let temp = [...arr]; // 複製一份避免動到原始資料
  if (mode === 'id') {
    temp.sort((a, b)=> a - b);
  } else {
    temp.sort((a, b)=> parseFloat(b.process) - parseFloat(a.process));
  }
  return temp;
}

教學、延伸知識連結

第三十關:C3.js 圖表整合

題目連結

30. 問題

  1. 請嘗試用 codepen 附上你的解答,這次的需求是「用 c3.js 圖表顯示,看看誰的完課率最好,同時可以看出排名
  2. 圖表不局限於上面的長條圖,也可尋找合適的圖
  3. 週六日請嘗試寫一篇 blog,分享解題流程,讓其他人也可以受益

30. 參考解答

第三十一關:部落格文章閱讀

題目連結

略。

第三十二關:程式整合篇

題目連結

32. 問題

結合 29、30 關,左邊排序功能,右邊圖表顯示。

32. 參考解答

第三十三關:圓餅圖分析

題目連結

33. 問題

圓餅圖圖表

繪製尚未開賽跟已開賽的比例圓餅圖。

33. 參考解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
let processCount = {
  non: 0,
  start: 0, 
};

data.forEach((item)=> {
  if (parseFloat(item.process) > 0) {
    processCount.start += 1;
  } else {
    processCount.non += 1;
  }
});

第三十四關:圓餅圖分析(中文字串判別)

題目連結

34. 問題

觀察每個參賽者的「姓名長度的字元數」

34. 參考解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
function strLen(str) {
  if (str == null) return 0;
  if (typeof str != 'string') {
    str += '';
  }
  return str.replace(/[^\x00-\xff]/g, '01').length;  
}

let nameLengthCount = {
  lessSix: 0,
  moreSeven: 0, 
};

data.forEach((item)=> {
  if (strLen(item.name) > 6) {
    nameLengthCount.moreSeven += 1;
  } else {
    nameLengthCount.lessSix += 1;
  }
});

教學、延伸知識連結

第三十五關:圓餅圖與長條圖合併使用

35. 問題

範例連結

結合 API,同時顯示長條圖與圓餅圖,並顯示各區間完課率人數。

35. 參考解答

注意,process 是浮點數,因此判斷區間時,<= 20< 21 結果可能會有些微差異。


竹白
作者
竹白
前端筆記

文章目錄