Kata Practice - Abbreviate a two word name (JavaScript)

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
2
3
4
5
function abbrevName(name){
const words = name.trim().split(' ');
const initials = words.map(word => word.charAt(0).toUpperCase());
return initials.join('.');
}

解題脈絡

其實我原本想不到要怎麼解,所以先查了一些字串處理的文章。最後決定先把名字拆成兩個陣列的值,再用 chartAt 的字串處理方式取出每一個單字的第一個 character 後,使用 join 將取出的字串用 . 合併。

其他人的解法

1
2
3
function abbrevName(name){
return name.split(' ').map(i => i[0].toUpperCase()).join('.')
}

選擇記錄這個解法的原因

其實是和我自己的解法一模一樣,只是它沒有使用額外的變數來宣告並儲存處理後的值,而是直接將所有的陣列處理都用在 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 是在做什麼樣的操作?
    所以最後才沒有選擇這個使用正規表達式的解答。

那我們就下次見囉ʘ‿ʘ

評論