iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0

我今天幫 App 新增了歷史月報與跨月趨勢分析。
前面的功能主要是在看「這個月花了多少」,今天進一步把不同月份的資料整理起來,讓使用者可以比較每個月的收入、支出與變化。
這次接觸到比較多資料處理邏輯,像是 Data Grouping、MoM 成長率、資料排序與防錯處理。

先把不同月份的資料分組
原本每一筆記帳資料只有自己的日期,例如:
2026-07-15
2026-08-03
2026-08-20
2026-09-10

但如果要製作「歷史月報」,就不能一筆一筆看,而是要先把它們整理成:
2026-07 → 收入、支出
2026-08 → 收入、支出
2026-09 → 收入、支出

所以我使用 forEach(),根據日期前 7 個字元,也就是 YYYY-MM,把資料分到對應的月份:
https://ithelp.ithome.com.tw/upload/images/20260923/20183949NMTa3eJoKz.jpg
在過程中,我學會了 slice、累計等功能的程式碼,也用了之前學過的 forEach()。這不只是單純地逐筆跑過資料,而是進一步將資料重新分類並進行累加,我從中學會了很多。

遇到資料不完整時,也要先防錯
這次有一個我覺得很重要的地方:
https://ithelp.ithome.com.tw/upload/images/20260923/20183949GhtfO5AnkZ.jpg
如果直接寫:
https://ithelp.ithome.com.tw/upload/images/20260923/20183949S4FtTUEG8s.jpg
當某筆舊資料沒有 date 時,就可能直接出現錯誤。
所以我加上條件判斷:
有日期 → 取出年月
沒有日期 → 歸類到「其他」
不要只是想「正常資料怎麼跑」,也要想「如果資料不完整會怎樣?」

計算每個月的支出變化:MoM
有了每個月的支出資料後,我又加入 MoM(Month-over-Month)月成長率。
公式:
MoM=(本月支出−上月支出)/上月支出×100%
實際寫成 JavaScript:
https://ithelp.ithome.com.tw/upload/images/20260923/20183949jDzOpC8d6I.jpg
例如:
上個月:10,000 元
這個月:12,000 元
(12,000 - 10,000) / 10,000 × 100%
= 20%
就可以知道這個月的支出比上個月增加了 20%。

處理上個月是 0 元的特殊情況
MoM 看起來只是套公式,但實際寫程式時還是會遇到特殊情況。
如果我上個月的支出是0元的話要怎麼辦?
所以我在函式最前面先判斷:
https://ithelp.ithome.com.tw/upload/images/20260923/20183949SVt37Ia0qv.jpg
**
有時候數學公式能成立,不代表任何輸入資料都能直接套公式。
實際寫程式時,還是要處理邊界條件。**

這邊貼上成果:
https://ithelp.ithome.com.tw/upload/images/20260923/20183949gcLTQyw4a8.png

總結:

  • Data Grouping:使用物件 Key 將不同日期的資料依月份分類
  • 資料 Aggregation:將同月份的收入、支出與筆數累加起來
  • 防錯處理:避免 date 不存在,以及 MoM 除以 0 的問題
  • MoM 月成長率:比較本月與上月支出的變化幅度
  • sort() + localeCompare():將 YYYY-MM 格式的月份按照時間順序排列
  • 資料處理思維:開始從「這段 Code 怎麼寫」轉向思考「資料要怎麼流動」

小小的心得:
雖然大部分程式碼還是由 AI 協助完成,但正因如此,我應該更謹慎地去理解這些程式碼。使用 AI 的同時,我也希望自己能清楚知道程式在做什麼、我真正想要的是什麼、哪裡不合邏輯,而不是一味地複製貼上。
過程中多少還是會有想偷懶的時候,但我常常會提醒自己:「如果什麼都直接叫 AI 做,那我自己又學到了什麼?我又可以做什麼?」所以我還是會逼自己去看懂、去思考。對我來說,Vibe Coding 不只是讓 AI 幫我把程式寫出來,而是在 AI 的協助下,慢慢學會理解程式、判斷問題。


上一篇
Day 21|路由重構與多幣別結算
下一篇
Day 23|錢包重構與動態存錢目標:讓資料真正連動
系列文
Vibe Coding 實戰手冊:30 天打造具備預算控管與數據視覺化的 React 記帳應用 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言