【JavaScript】文字列内の各単語から最後の母音を削除する方法
はじめに
JavaScriptでは、文字列を受け取り、各単語の最後の母音(a・e・i・o・u)を取り除いた新しい文字列を返す関数を作成する課題によく出会います。本記事では、その実装方法を具体的なコード例とともにわかりやすく解説します。
期待される動作の例
たとえば、次のような文字列が入力された場合を考えてみましょう。
const str = 'This is an example string';
このとき、期待される出力は次のとおりです。
const output = 'Ths s n exampl strng';
各単語(This、is、an、example、string)から、それぞれ最後に登場する母音が1つずつ削除されていることが分かります。
実装コード
以下は、この要件を満たすJavaScriptのコードです。
const str = 'This is an example string';
// 単語から最後の母音を1つ削除する関数
const removeLast = word => {
const lastIndex = el => word.lastIndexOf(el);
// 5つの母音の中で最も右側にある位置を取得
const ind = Math.max(
lastIndex('a'), lastIndex('e'), lastIndex('i'),
lastIndex('o'), lastIndex('u')
);
return word.substr(0, ind) + word.substr(ind + 1, word.length);
};
// 文字列全体を処理する関数
const removeLastVowel = str => {
const strArr = str.split(' ');
return strArr.reduce((acc, val) => {
return acc.concat(removeLast(val));
}, []).join(' ');
};
console.log(removeLastVowel(str));
コードの解説
処理の流れは以下の4ステップです。
- 単語への分割:
split(' ')を使って、文字列をスペース区切りで各単語に分解します。 - 最後の母音の位置を特定:
lastIndexOf()を5つの母音それぞれに対して実行し、Math.max()で最も大きい(=最も右側にある)インデックスを取得します。 - 母音の削除:
substr()でその位置の前後の文字列をつなぎ合わせることで、該当する母音だけを取り除きます。 - 再結合:
reduce()で処理済みの単語を配列にまとめ、join(' ')でスペース区切りの文字列に戻します。
より簡潔な書き方(map版)
reduce() の代わりに map() を使うと、同じ処理をもっとシンプルに記述できます。
const removeLastVowel = str =>
str.split(' ').map(removeLast).join(' ');
実行結果
コンソールには次のように出力されます。
Ths s n exampl strng
補足:注意点
- このコードは小文字の母音のみを対象としています。大文字の母音(A〜U)が含まれる可能性がある場合は、
toLowerCase()などと組み合わせて判定すると安全です。 - 母音を含まない単語では、すべての
lastIndexOf()が −1 を返すため、その単語は変更されずにそのまま残ります。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
JavaScriptのconstとletの違いを徹底解説!ブロックスコープ変数の基本と使い方
JavaScriptにおけるconstとletの基本const と let は、ES2015(ES6)で導入された変数宣言用のキーワードです。どちらもブロックスコープ(波括弧 { } で囲まれた範囲)に対応しているのが特徴で、関数スコープしか持たなかった従来の var とは異なる挙動を示します。両者の大きな違いは再代入の可否です。letで宣言した変数は後から何度でも値を再代入できますが、constで宣言した変数は再代入しようとするとエラー(TypeError)が発生します。letとconstの主な違い項目letconst再代入可能不可(エラー発生)スコープブロックスコープブロックスコープ宣言時