昨今、codewarsの問題に取り組んでいます。その備忘録。
今回の問題
Complete the function that accepts a string parameter, and reverses each word in the string. All spaces in the string should be retained.
"This is an example!" ==> "sihT si na !elpmaxe"
"double spaces" ==> "elbuod secaps"
文章の単語ずつで文字列を反対にする。
ポイントは単語の位置はそのままということ。
文字列反転でググる
出てきたのは下記の関数。早速、試してみる。
function reverseWords(str) {
return str.split("").reverse().join("");
}
console.log(reverseWords('.god yzal eht revo spmuj xof nworb kciuq ehT'));
// 出力
ehT kciuq nworb xof spmuj revo eht yzal .god
文字が反転しておらず、文全体単語ごとに反転している。
一旦仕組み復習
①split(” “)で単語ずつの配列を作成。(空白で区切る)
str.split(" ");
//出力
['.god', 'yzal', 'eht', 'revo', 'spmuj', 'xof', 'nworb', 'kciuq', 'ehT']
②上の配列をreverse();
reverse()は配列全体の順番を変える。
str.split(" ").reverse();
//出力
['ehT', 'kciuq', 'nworb', 'xof', 'spmuj', 'revo', 'eht', 'yzal', '.god']
③そして配列を半角スペースで繋ぐ→join(” “);
str.split(" ").reverse().join(" ");
//出力
ehT kciuq nworb xof spmuj revo eht yzal .god
この方法は一文字の時はOK。今回は文章なので、配列にして、その単語ごとに、上の関数を充てるのが良いという方向性で考えた。
【余談】一文字の時は下記となる
function reverseWords(str) {
return str.split("").reverse().join("");
}
console.log(reverseWords('HELLO!'));
//出力
!OLLEH
結論下記を回答とした
function reverseWords(str) {
const array = str.split(" ");
const newArray = array.map(elem => {
return elem.split('').reverse().join('');
})
return newArray.join(' ');
}
console.log(reverseWords('.god yzal eht revo spmuj xof nworb kciuq ehT'));
//出力
dog. lazy the over jumps fox brown quick The
解説
①まずは単語ごとに配列を作成する。
②mapにて要素1つずつに対して、上の関数を充てる
③ ②でできた新しい配列に対して、join(” “)(半角スペースで連結)
ベストプラクティスは下記
function reverseWords(str) {
return str.split(' ').map(function(word){
return word.split('').reverse().join('');
}).join(' ');
}
もう少し、連結できたな。
後記
配列系のメソッドをすぐ忘れてしまうので引き続き解いていくぞー。
c.sakyou