Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

Codewars 練習 05:主題標籤產生器

問題

透過 generateHashtag() 函式來產生主題標籤 (hashtag),其規則如下:

  • 開頭為 #
  • 每個字的首位字母必須大寫。
  • 最終字串大於 140 字元時,回傳 false
  • 輸入空值或空白時,回傳 false

我的解法

function generateHashtag (str) {
  if( str.match(/\w{1,}/) === null ) return false;
  let final = '#' + str.split(/\s+/).map( function(w){
    return w[0].toUpperCase()+w.slice(1)
  } ).join( '' );
  return final.length > 140 ? false : final;
}

評選最佳解法

原本評選的最佳解法沒有辦法處理字串過長的問題,因此將其淘汰,改選第二高票的作法。

function generateHashtag (str) {
   if(!str || str.length < 1) return false;
   
   var r = '#' + str.split(' ').map(function(el) {
     return el.charAt(0).toUpperCase() + el.slice(1).toLowerCase();
   }).join('');
   return r.length > 140?false:r;
}

第二高票的作法當中,並沒有辦法排除掉全部使用空格的情況,例如:' '。此外,留言中也有人提到,並非每次都該使用 toLowerCase() 的方式,將後續字串變成小寫,因為「縮寫」的時候會產生未預期的結果 (NASA 變成 Nasa)。

改善點

這次參考了其他人的解法後發現,可能是這一題有多次經過修改,所以許多舊的解法其實已經不適用了。因此,某種程度上,這次我自己的解答也可以當作是最佳解吧(笑)

這次有忍住不用 map() 的方式來進行,其實和大部分的解決方式都差不多。可以調整的地方應該是第一步,也許可以不需要用規則運算式來判斷,會更有效率?

需要注意的另一點,在利用 map() 進行置換的時候,我使用的是中括號 [0] 的方式來指定首位字元,而其他人的寫法則是 charAt(0)。上網搜尋了一下差異,我的作法是在 ES5 以後的近代語法,在 IE8 以前的瀏覽器是不支援的。

Eric Chuang
Eric Chuang

正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料