更新於 2024/10/01閱讀時間約 3 分鐘

#10 Codewars - String ends with? (7 kyu)

題目

原始題目

完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。

例子:
solution('abc', 'bc') // returns true
solution('abc', 'd') // returns false

拆解流程

依據題意可整理出以下重點:

  • 目標:比對第一個參數結尾是否等同於第二個參數
  • 規則:參數傳入的都是字串型別
  • 方法:使用 endsWith 方法,查找字串結尾是否有符合

程式撰寫

function solution(str, ending) {
return str.endsWith(ending)
}

endsWidth

  • 回傳:Boolean
  • 此方法可傳入兩個參數:第一個參數是要比對的字串;第二個參數是從哪個結尾位置開始比對,可不傳入,預設為 str.length
  • 注意:第一個參數不能傳入正規表達式,會回傳 TypeError

改善寫法

使用 substring 方法

MDN 上有說明 substr 方法已被棄用,因此這邊改為使用功能類似的 substring 方法撰寫

  • 功能:擷取出指定字串
  • 需要傳入兩個參數:第一個是起始索引,第二個是結束索引,擷取出的字串並「不包括」結束索引
  • 回傳:字串型別,擷取出的新字串
  • 參數規則:
  1. 若未寫入第二個參數,會從起始索引提取字符到結尾
  2. 如果 start === end,返回一個空字串
  3. 如果 start >= end,效果會像兩個參數調換位置
  4. 參數小於 0 或為 NaN 都會被視為等於 0;大於 str.length 會被視為 str.length

透過此方法可以擷取出和比對字串相同長度的字串,再透過邏輯運算子做比對

function solution(str, ending) {
return str.substring(str.length-ending.length) === ending
}


使用 slice 方法

和上面的方法很像,較為不同的是,參數若為負值,會從字符串結尾開始計算

function solution(str, ending) {
let endIndex = ending.length ? -ending.length : str.length
return str.slice(endIndex) === ending
}

裡面有一個測試是 solution('abc', ''),需要回傳 true。

因此加入了三元運算子做判斷,當 ending.length 為 0 時回傳 str.length(因為 0 會被轉型成 false);不等於 0 時就回傳負值的 ending 字串長度,前者會回傳空字串,後者則會從字符串結尾開始擷取字串。

今天就介紹到這裡,如果大家有更好的寫法歡迎一起來討論~

參考資料


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.