Kata Practice - Abbreviate a two word name (JavaScript)
這個系列會把自己練習過的 Kata 題目記錄下來,希望除了記錄的性質以外也能夠觀察自己撰寫程式邏輯的進化過程。如果有幸看到這邊的話也可以參考一下,再到 Codewars 的網站註冊一個帳號試著玩看看,自己蠻喜歡整個網站的得分和排行榜設定,會讓人越寫越有成就感喔!
題目
Write a function to convert a name into initials. This kata strictly takes two words with one space in between them.
The output should be two capital letters with a dot separating them.
It should look like this:
Sam Harris => S.H
patrick feeney => P.F
自己的解法
1 | function abbrevName(name){ |
解題脈絡
其實我原本想不到要怎麼解,所以先查了一些字串處理的文章。最後決定先把名字拆成兩個陣列的值,再用 chartAt
的字串處理方式取出每一個單字的第一個 character 後,使用 join 將取出的字串用 .
合併。
其他人的解法
1 | function abbrevName(name){ |
選擇記錄這個解法的原因
其實是和我自己的解法一模一樣,只是它沒有使用額外的變數來宣告並儲存處理後的值,而是直接將所有的陣列處理都用在 name
這個參數上,更簡潔也更清楚
觀念釐清
其實除了上面的解法之外,也有看到一個很有趣的解法:
1 | const abbrevName = name => name.match(/\b\w/g).join('.').toUpperCase() |
這是使用了正規表達式的一個解法,其中:
\b
代表單詞邊界(word boundary)\w
代表匹配任意單詞字符(包括字母、數字和下劃線)g
是一個修飾符,代表全局(global)模式,讓正規表達式可以匹配字串中的所有單詞字符。
因此name.match(/\b\w/g)
將會把名字字串中每個單詞的第一個 character 作為單獨的元素提取出來,並組成一個數組。例如,對於 “Sam Harris”,結果將是["S", "H"]
。
不過我沒有選擇這個為最佳解的原因是,透過 Array 的處理方式好像相較比較好閱讀,也更清楚知道這個 function 是在做什麼樣的操作?
所以最後才沒有選擇這個使用正規表達式的解答。
那我們就下次見囉ʘ‿ʘ