JavaScriptで文字列の配列を2つの部分に分割する全パターンを取得する方法
問題
少なくとも2つの要素を持つ文字列の配列を受け取るJavaScript関数を作成することを考えます。
この関数の目的は、その配列を2つの空でない部分に分割するすべてのパターンを返すことです。
たとえば、次の配列を見てみましょう。
["az", "toto", "picaro", "zone", "kiwi"]
この場合、生成されるべき分割パターンは以下のとおりです。
"(az, toto picaro zone kiwi)
(az toto, picaro zone kiwi)
(az toto picaro, zone kiwi)
(az toto picaro zone, kiwi)"
アプローチの考え方
この問題は非常にシンプルで、区切り位置を1つずつずらしながら配列を前半と後半に分けるだけで解決できます。
具体的には、区切り位置 i を 1 から 配列の長さ - 1 まで順番に変化させ、以下のように処理します。
arr.slice(0, i): 先頭からi番目の直前までを切り出し、前半部分とするarr.slice(i):i番目以降を切り出し、後半部分とする
それぞれの部分を join(" ") でスペース区切りの文字列に結合すれば、1つの分割パターンが完成します。この操作を全区切り位置に対して繰り返すことで、すべてのパターンを網羅できます。
実装例
以下が実際のコードです。
const arr = ["az", "toto", "picaro", "zone", "kiwi"];
const findAllPossibilities = (arr = []) => {
let array;
const res = [];
for(let i = 1; i < arr.length; i++){
array = [];
array.push(arr.slice(0, i).join(" ")); // 前半部分
array.push(arr.slice(i).join(" ")); // 後半部分
res.push(array);
}
return res;
};
console.log(findAllPossibilities(arr));
コードのポイント
- ループ範囲:
iを1から開始しarr.length - 1で終了することで、前半・後半のどちらも空にならない分割だけを生成しています。 - slice の活用: 元の配列を破壊せずに部分配列を取得できるため、安全かつ簡潔に記述できます。
- join による結合: 各部分配列をスペース区切りの1つの文字列にまとめることで、要求された形式の出力を実現しています。
出力結果
[
[ 'az', 'toto picaro zone kiwi' ],
[ 'az toto', 'picaro zone kiwi' ],
[ 'az toto picaro', 'zone kiwi' ],
[ 'az toto picaro zone', 'kiwi' ]
]
まとめ
配列を2つに分割する全パターンを求める問題は、slice() と join() を組み合わせたシンプルなループ処理で効率的に解決できます。計算量は区切り位置の数に比例する O(n) であり、配列の長さが長くなっても高速に動作します。同様の「配列の分割」「組み合わせ列挙」の問題に応用できるテクニックなので、ぜひ覚えておきましょう。
-
JavaScriptで配列を文字列に変換する方法|toString()メソッドの使い方
JavaScriptで配列を文字列に変換するには、toString()メソッドを使用します。ArrayオブジェクトのtoString()メソッドは、指定された配列とその要素を表す文字列を返します。各要素はカンマ(,)で区切られて連結され、1つの文字列として出力されます。なお、配列を文字列コンテキストで扱った場合にも、このtoString()メソッドは自動的に呼び出されるため、配列から文字列への変換において最も基本的なメソッドといえます。サンプルコード以下のコードを実行すると、配列がどのように文字列へ変換されるかを確認できます。<html> <head
-
JavaScriptで配列を空にする4つの方法【サンプルコード付きで解説】
JavaScriptで配列を空にする方法は、主に4つあります。それぞれ動作の仕組みや特徴が異なるため、目的に応じて適切な方法を選ぶことが大切です。配列を空にする4つの方法新しい空の配列を代入する:配列変数に、新しく作成した空の配列を代入します。最もシンプルな方法ですが、元の配列を参照している他の変数が残る点には注意が必要です。lengthプロパティを使う:配列のlengthプロパティに0を設定するだけで、すべての要素を削除できます。高速で、元の配列への参照も維持されるため、実務で最もよく使われる方法のひとつです。popメソッドを使う:配列の要素数が0になるまで、popメソッドで末尾の要素を繰り