JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで母音と子音が交互に現れているかを検証する方法


問題

英語のアルファベットからなる文字列 str を唯一の引数として受け取るJavaScript関数を作成します。この関数は、入力文字列内で母音と子音が交互に現れている場合にのみ true を返し、それ以外の場合は false を返す必要があります。

例えば、関数への入力が次の場合を考えてみましょう。

入力

const str = 'amazon';

出力

const output = true;

出力の説明

文字列「amazon」は、a(母音)→ m(子音)→ a(母音)→ z(子音)→ o(母音)→ n(子音)という順序になっており、母音と子音が交互に現れているため true となります。

解決のアプローチ

この問題は、以下の手順で解くことができます。

  • まず、文字列の先頭の文字が母音かどうかを正規表現 /[aeiou]/ で判定します。
  • 先頭が母音の場合、偶数インデックス(0, 2, 4…)の文字はすべて母音、奇数インデックス(1, 3, 5…)の文字はすべて子音でなければなりません。
  • 先頭が子音の場合は、この関係が逆になります。
  • Array.prototype.every() メソッドを使えば、「すべての文字が条件を満たしているか」を簡潔にチェックできます。1つでも条件を満たさない文字があれば false が返されます。

コード例

以下が実際のコードです。

const str = 'amazon';
const appearAlternatingly = (str = '') => {
    return str.split('').every((v,i)=>{
       if (/[aeiou]/.test(str[0])){
           if (i%2===0&&/[aeiou]/.test(v)){
              return true
           } else if (i%2!==0&&!/[aeiou]/.test(v)){
              return true
           } else {
              return false
           }
        }
        if (!/[aeiou]/.test(str[0])){
            if (i%2==0&&!/[aeiou]/.test(v)){
               return true
            } else if (i%2!==0&&/[aeiou]/.test(v)){
                return true
            } else {
                return false
            }
        }
    })
};
console.log(appearAlternatingly(str));

出力結果

true

より簡潔な実装(リファクタリング版)

上記のコードは正しく動作しますが、if文の分岐が多くやや冗長です。「各位置で期待される文字種」と「実際の文字種」を比較する形に整理すると、次のようにシンプルに書けます。

const appearAlternatingly = (str = '') => {
  const isVowel = c => /[aeiou]/.test(c);
  const firstIsVowel = isVowel(str[0]);
  return [...str].every((v, i) => {
    // 偶数番目は先頭と同じ種類、奇数番目は逆の種類であるべき
    const shouldBeVowel = i % 2 === 0 ? firstIsVowel : !firstIsVowel;
    return isVowel(v) === shouldBeVowel;
  });
};
console.log(appearAlternatingly('amazon')); // true
console.log(appearAlternatingly('apple'));  // false

この実装では、スプレッド構文 [...str] で文字列を配列化し、every() によって全文字を検証しています。ロジックが一目で理解でき、可読性と保守性の両方が大きく向上します。

  1. JavaScriptの分割代入を使った関数パラメータの受け渡し方法

    JavaScriptでは、関数にオブジェクトを引数として渡す際、「分割代入(デストラクチャリング)」と呼ばれる構文を利用することで、オブジェクトの各プロパティを個別の変数として受け取ることができます。 さらに、各プロパティにデフォルト値を指定しておけば、対応するプロパティが存在しない場合でもエラーにならず、あらかじめ設定した値が使用されます。これにより、安全で柔軟な関数設計が可能になります。 サンプルコード 以下は、分割代入を使って関数のパラメータを受け取るJavaScriptのコード例です。 <!DOCTYPE html> <html lang="en&quo

  2. 【初心者向け】JavaScriptでインポートとエクスポートの名前を変更する方法

    JavaScriptにおけるインポートとエクスポートの名前変更とはJavaScriptのESモジュールでは、asキーワードを使うことで、エクスポートやインポートの際に関数や変数に別名を付けることができます。モジュール側の元の名前はそのまま維持しながら、利用する側では分かりやすい名前で扱えるため、コードの可読性と保守性が向上します。注意:このサンプルを実行するには、ローカルホストサーバー環境が必要です。HTMLファイルを直接ブラウザで開くと、CORSポリシーの制限によりモジュールの読み込みが失敗する場合があるためご注意ください。コード例index.html<!DOCTYPE html>