---
# System prepended metadata

title: 3/30 線上 Slack 助教
tags: [JS 直播班 - 2021 春季班]

---

---
tags: JS 直播班 - 2021 春季班
---

# 3/30 線上 Slack 助教

## 今日輪班助教時間

hsin-yu：3/30（二）
早上 10:00 - 中午 12:00，下午 1:00 -下午 5:00

## 發問規範

老師助教同學們好，**這是我的 Codepen**，我**原本預期**「JS 第 8 行會出現數字 8」，**但卻出現**「預期外的結果是 0」，想問下問題出在哪裡？

## 注意

1. 請各位先到 Slack 上將問題放在助教服務內的 thread，如圖
 ![](https://i.imgur.com/nHE3sOx.png)
2. 遵循以上的發問規範以便助教查看問題，不可直接貼上網址而沒有說明文字或者只提供截圖
3. 助教會依照 Slack 上的順序回覆問題
4. 以下問題區塊只能由助教自行增加
5. 助教會將回覆寫在下方問題區塊

## 問題

1. **Dora：**
老師助教同學們好，這是我的 [Codepen](https://codepen.io/ChiaLingShen/pen/gOgwwVe?editors=0010)，我印象中老師說可以修改 y 軸，但我看了c3.js 教學，並沒有看到可以修改 y 軸的部分，請問要如何修改 y 軸資料呢?
延續上面的問題，我想修改 js code 第 12 行及第 13 行，資料顯示的線條顏色，我使用開發者工具檢查，想說要找到對應的選取器來修改顏色，但我找不到阿，請問要如何修改資料線條的顏色呢?

> 助教回覆：
> 有的～修改圖表 y 軸可以參考 c3.js 的 Reference，左側選單可以找到 axis，有客製化 x 軸和 y 軸的範例，例如修改 y 軸文字可以參考 https://c3js.org/reference.html#axis-y-tick-values 自訂 y 軸的值
> 修改圖表顏色可以參考 https://c3js.org/reference.html#data-colors 
在 data 屬性中設定 colors，這裡拿同學的 codepen 當範例修改線條顏色 （[JS 第 15 行](https://codepen.io/tina2793778/pen/LYxRMaZ?editors=1010)）
可以再嘗試設定看看～若有不清楚的地方歡迎再發問～


2. **Pei Wang**
老師助教同學們好，這是我的 [Codepen](https://codepen.io/wang-pei-shin/pen/LYxRvjE?editors=1010)
(js116)原本想將gauge()和innerHTML寫在一起跑forEach，先完成HTML的部分，再進行gauge()產生圖表。結果只有最後一個圖表正常，其他的不會顯示色塊百分比到多少。
將gauge()單獨挪出來寫後(js120-122)，圖表即能正常顯示，請問為什麼原先方法無法作用呢？
> 助教回覆：
> 因 forEach 跑圖表會有非同步的問題，因此加上 setTimeout 就可以寫在一起
```
function renderGauge() {
  const successRate = document.querySelector(".successRate");
  successRate.innerHTML = "";
  groupSuccessArr.forEach(function (i) {
    successRate.innerHTML += `
        <li>
        <h3>第${i[0]}組任務達成率</h3>
        <div class="successRate${i[0]}"></div>
        </li>`;
    setTimeout(() => {
      gauge(i[0], i[1]);
    })
  });
}
```
> 補充：
會先跑完 setTimeout 上面的程式，才進行 setTimeout 裡面的寫的程式 → 沒錯～
因為產生圖表有使用到遠端的資料所以會有非同步的情況喔
---

3. **Stacey Huang:**

老師助教同學們好，這是老師在第七周講義所附的 [BMI kata 投稿人數折線圖(時間序列折線圖)](https://codepen.io/hexschool/pen/eYgOBeN?editors=0010) 與[折線圖增加時間軸](https://codepen.io/hexschool/pen/dyNbvOb?editors=1010),這兩個都是使用折線圖,但BMI kata投稿人數折線圖有使用xFormat屬性而折線圖增加時軸沒有使用xFormat屬性。不懂甚麼時候該使用xFormat屬性。
另外,當我刪掉BMI kata投稿人數折線圖xFormat屬性,圖表變得很奇怪。雖然官網上有說'xFormat' can be used as custom format of 'x'但我還是不是很清楚xFormat屬性的用途。
> 助教回覆：
> xFormat 屬性主要是為了將帶入的資料 "2021/3/10" 自訂日期格式，才能正確轉成 date 物件顯示在圖表上（"2021-3-10" 的格式可以正確轉為 date 物件，因此不需再設定 xFormat 屬性）
BMI kata 投稿人數折線圖刪掉 xFormat 屬性後，因為無法正確將日期的字串 "2021/3/10" 轉成 date 物件，因此會出錯
可以參考這兩篇討論：
https://stackoverflow.com/questions/32642089/c3-js-timeseries-with-time-fails-to-parse
https://stackoverflow.com/questions/32946646/c3-js-how-to-specify-the-timestamp-format-when-plotting-timeseries-taken-from
兩個作用不同，xFormat 是用來轉換日期格式， axis 中的 format 是用來設定顯示的部分
```
 
xFormat: ‘%Y-%m-%d %H:%M:%S’, // how the date is parsed

axis: {
        x: {
            type: ‘timeseries’,
            tick: {
                format: ‘%Y-%m-%d %H:%M:%S’ // how the date is displayed
            }
        }
}

```
> xFormat [範例](https://codepen.io/tina2793778/pen/poRNMQZ?editors=0011) 
假設帶入的 x 軸資料是 
 [‘x’, ‘2013’, ‘2014’, ‘2015’, ‘2016’, ‘2017’, ‘2018’],
就需加上 xFormat 屬性 
xFormat: ‘%Y’ 
才能正確顯示在圖表上

謝謝助教的回覆,也就是說當所帶入的日期不能轉成date物件的格式時,就必須使用xFormat,轉成date物件格式。想再請問一下,要如何得知所帶入的日期是否能夠正確地轉換成date物件格式呢? 是否使用以下方法呢?看到助教提供的討論中有提到這個方法。
new Date('帶入日期時間').toISOString();
謝謝:)
>助教回覆：
>這裡要修改一下上次的回覆，應該是原本的日期時間字串都是可以轉換成 Date 物件的，但是目前只知道有 2021-03-10 這種格式可以正確讀取，因此可以都先將拿到的資料 日期格式改成這樣（yyyy-mm-dd）來推入
如果是其他格式還是建議搭配 xFormat 就可以更快速的讓日期轉換為統一的格式
這樣就不需驗證是否可以正確讓 c3 轉換～
同學貼的方法
`new Date('帶入日期時間').toISOString();`
因原本的日期字串也可以轉為 Date 物件，因此用上方的方法無法驗證是否可以讓 c3 這邊正確讀取

4. **Fred Chang:**

老師助教同學們好，這是穎旻助教第六週助教分享的 [Codepen](https://codepen.io/AliceChiang/pen/OJbqyxv)，想請問關於JS的第62行if(!location) 的意思是什麼? 是為了讓if判斷為true執行內容嗎? 自己查資料時有查到關於[Logical NOT](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT)，不確定是不是這個用法，如果是的話也不太明白為什麼是這樣寫，還請助教協助解答，謝謝!

> 助教回覆：
> ! 是同學查到的用法沒錯喔～
因篩選地區時如果 render 函式的 location 值是 undefined 或 "" ，和 false 一樣被定義成假值（代表「沒有」的意思，可以參考這篇[說明](https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy)：除 false、0、""、null、undefined 和 NaN 以外皆为真值）
>如果 location 是有值的（例如："台北" ）那 if (location) 就會是 true
如果 location 是 undefined 或 "" ，那  if (!location) 就會是 true，
第 143 行 render(areaSelect.value);，areaSelect.value 的值不是台北、台中、高雄，就不需篩選出地區，因此可以直接 return 

Jordan 同學回覆的是沒錯的哩，感謝同學的支援～～

（這裡只能由助教自行增加問題，請大家將問題放在 thread 上）





