昨今、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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA