JavaScriptで指定した複数の区切り文字に基づいて文字列を分割し、配列を返す方法
問題の概要
文字列と、区切り文字として指定された任意の個数の文字を受け取り、指定されたすべての区切り文字に基づいて文字列を分割した配列を返すJavaScript関数を作成する必要があります。
入力例
たとえば、次のような文字列があるとします。
const str = 'rttt.trt/trfd/trtr,tr';
区切り文字は以下のとおりです。
const sep = ['/', '.', ','];
この場合、期待される出力は次のようになります。
const output = [ 'rttt', 'trt', 'trfd', 'trtr' ];
実装コード
以下が実際の実装例です。
const str = 'rttt.trt/trfd/trtr,tr';
const splitMultiple = (str, ...separator) => {
const res = [];
let start = 0;
for(let i = 0; i < str.length; i++){
if(!separator.includes(str[i])){
continue;
}
res.push(str.substring(start, i));
start = i + 1;
}
return res;
};
console.log(splitMultiple(str, '/', '.', ','))
出力結果
コンソールには以下のように表示されます。
[ 'rttt', 'trt', 'trfd', 'trtr' ]
コードの解説
この関数の仕組みを順を追って見ていきましょう。
- 結果を格納するための空の配列
resと、現在処理中の部分文字列の開始位置を記録する変数startを用意します。 - 文字列を1文字ずつ走査し、
separator.includes()でその文字が区切り文字のリストに含まれるかどうかを判定します。 - 区切り文字でない場合は
continueでスキップし、次の文字へ進みます。 - 区切り文字が見つかったタイミングで、
substring()を使って開始位置からその直前までの部分文字列を切り出し、resに追加します。その後、開始位置を区切り文字の次の位置へ更新します。
末尾の部分文字列も取得したい場合
この実装では、文字列の末尾が区切り文字で終わっていない場合、最後の部分文字列は配列に含まれません。末尾の部分も結果に含めたい場合は、ループ処理の後に以下のコードを追加します。
if (start < str.length) {
res.push(str.substring(start));
}
別のアプローチ:split() と正規表現を活用する
実は、String.prototype.split() に正規表現を渡すことで、同じ処理をよりシンプルに1行で実現できます。
const str = 'rttt.trt/trfd/trtr,tr'; const result = str.split(/[.,\/]/); console.log(result);
この方法では、末尾の部分文字列も含めた次のような結果が得られます。
[ 'rttt', 'trt', 'trfd', 'trtr', 'tr' ]
用途に応じて、自作関数による柔軟な制御と、正規表現を使った簡潔な記述を使い分けるとよいでしょう。
-
JavaScriptで配列の値に基づいて文字列の文字をシフトする方法
本記事では、小文字の英字のみで構成された文字列に対して、配列内の数値に従って各文字をシフトするJavaScript関数の実装方法を解説します。 問題の概要 まず、「1単位のシフト」を次のように定義します。ある文字を、アルファベット順でその直後の文字に置き換えること。これには循環(ラップアラウント)も含まれます。つまり、「z」の次の文字は「a」となります。 今回作成する関数は、以下の2つの引数を受け取ります。 str: 小文字英字のみを含む文字列(第1引数) arr: strと同じ長さを持つ数値の配列(第2引数) 関数は、元の文字列の各文字を、配列arr内の同じ位置にある数値の分だけ
-
JavaScriptで配列内の唯一の異なる文字列を見つける方法
問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と