題目連結:Remove String Spaces | Codewars
Instructions
Write a function that removes the spaces from the string, then return the resultant string.
Examples
Input -> Output
"8 j 8 mBliB8g imjB8B8 jl B" -> "8j8mBliB8gimjB8B8jlB"
"8 8 Bi fk8h B 8 BB8B B B B888 c hl8 BhB fd" -> "88Bifk8hB8BB8BBBB888chl8BhBfd"
"8aaaaa dddd r " -> "8aaaaaddddr"
Solution
思考方向
先把字串轉成單個字的陣列、把空白的 element 過濾掉,再組回字串。
function noSpace(x){
// Single out the spaces, return each characters in an array
const charAry = x.split('').filter( word => word!== ' ')
// Concat the words
return charAry.reduce((accum, current) => accum.concat(current))
}
- 用
split()
來把字串轉成陣列。因為要分割的是單個字母 (character) 而不是詞 (word),所以參數(條件)為空字串:split('')
- 用
filter()
篩選出非空格的值:word !== ' '
- 將
filter()
返回的陣列中的每個 element 透過concat()
組回字串,因為要累加,所以使用了reduce()
更好的解法
自己暫時沒有想到更好的優化方式,所以參考了其他人的解答。這幾種做法都比我的好很多:
- 用字串的
replace()
透過 regex 條件,把非字母用空字串''
替換掉
function noSpace(x){
return x.replace(/\s/g, '');
}
這個是我覺得最符合題意的做法,但不熟 regex 會擔心下錯條件
2. 用字串的 replaceAll()
把空格' '
替換成空字串''
function noSpace(x) {
return x.replaceAll(' ', '');
}
雖然有可能遇到空格不只一個的狀況,但即便是一個以上的空格也還是可以以一個空格為單位來過濾掉
3. 用 split(' ')
過濾掉空格,再用 join()
組回字串
function noSpace(x){return x.split(' ').join('')}
這也是用了 split()
,並且後續就直接用 join()
組回字串其實就可以了
這邊我也發現到,因為最後的答案還是要把所有的字組成一個字串,所以我之前擔心 split(' ')
return 的會是詞而不是字,而改用 split('')
其實是多慮了,反而在組字串之前還要用 filter()
把空格篩掉
Key Takeaways
參考其他人的解答之後,發現自己根本對於 string 的 methods 太不熟悉了,都想要先轉成 array 處理再轉回 string ,其實根本多此一舉 XD
透過這個題目來複習一下幾個 methods:
string.replace()
replace(pattern, replacement)
Parameters:
- pattern:可以是值也可以是 regex
- replacement:可以是值也可以是 function
Return value: returns a new string (does not mutate the original string)
string.split()
split(separator)
split(separator, limit)
Parameters
- separator: 可以是 undefined, string 或 regex
- limit (optional): 可以設置 split 的上限,超過上限就不會回傳了。如果
limit
是0
,回傳的結果就是[]
Return value: array
array.join()
join()
join(separator)
The
join()
method creates and returns a new string by concatenating all of the elements in an array
Parameters:
- separator (optional):element 之間要用什麼相連。如果忽略不寫的話, element 會用逗號
","
相連;如果是空白字串""
,element 全部組成沒有任何空格的 string
const elements = ['Fire', 'Air', 'Water'];
console.log(elements.join());
// Expected output: "Fire,Air,Water"
console.log(elements.join(''));
// Expected output: "FireAirWater"
console.log(elements.join('-'));
// Expected output: "Fire-Air-Water"
Return value: string;如果 arr.length
為 0 ,會回傳 empty string