【JavaScript】文字列の配列から指定文字列の部分列(組み合わせ)を検索する方法
この記事では、文字列の配列と1つの文字列を受け取り、配列の中にその文字列の一部の並び(部分列)が含まれているかどうかを判定する関数を JavaScript で実装します。判定結果は真偽値(true / false)として返します。
問題の概要
たとえば、対象となる文字列が 'ACBC' の場合、次のような配列を渡したときに期待される結果は以下のとおりです。
const x = 'ACBC'; const arr = ['cat','AB']; const arr2 = ['cat','234','C']; const arr3 = ['cat','CC']; const arr4 = ['cat','BB']; console.log(containsString(arr, x)); // true → 「AB」は ACBC の部分列 console.log(containsString(arr2, x)); // true → 「C」は ACBC に含まれる console.log(containsString(arr3, x)); // true → 「CC」も ACBC の部分列 console.log(containsString(arr4, x)); // false → 「BB」は ACBC から作れない
解決策の考え方
ポイントは「文字をソートする」ことです。文字列を構成する文字をあらかじめ昇順に並べ替えておけば、「元の文字列の部分列であるか」という判定を、ソート済み文字列に対する部分文字列の包含チェックに置き換えられます。
例えば 'ACBC' をソートすると 'ABCC' になります。この中に 'AB' や 'CC' が含まれていれば、元の文字列の部分列だと判断できるわけです。
実装コード
const x = 'ACBC';
const arr = ['cat','AB'];
const arr2 = ['cat','234','C'];
const arr3 = ['cat','CC'];
const arr4 = ['cat','BB'];
// 文字列を分割・ソート・結合して返すメソッドを String.prototype に追加
const splitSort = function(){
return this.split("").sort().join("");
};
String.prototype.splitSort = splitSort;
const containsString = (arr, str) => {
const sorted = str.splitSort();
for(let i = 0; i < arr.length; i++){
const sortedEl = arr[i].splitSort();
if(sorted.includes(sortedEl)){
return true;
}
}
return false;
}
console.log(containsString(arr, x)); // true
console.log(containsString(arr2, x)); // true
console.log(containsString(arr3, x)); // true
console.log(containsString(arr4, x)); // false
コードの解説
- splitSort メソッド: 文字列を1文字ずつの配列に分解(
split(""))し、sort()で昇順に並べ替えてからjoin("")で再結合します。 - containsString 関数: 対象文字列をソートした結果を基準に、配列の各要素をソートした文字列が含まれるか(
includes)を順番にチェックします。1つでも見つかれば即座にtrueを返し、最後まで見つからなければfalseを返します。
実行結果
コンソールには次のように出力されます。
true true true false
補足:実務上の注意点
String.prototype へのメソッド追加は手軽ですが、既存コードやライブラリとの名前衝突を引き起こす可能性があります。実務では、プロトタイプを拡張せずにユーティリティ関数(const splitSort = str => str.split("").sort().join("") など)として独立させる方が安全です。
-
JavaScriptのfind()関数とは?配列から条件に合う最初の要素を取得する方法
JavaScriptのfind()メソッドは、配列の中から指定した条件を満たす最初の要素の値を返すために使用されます。条件を満たす要素がひとつも存在しない場合は、undefinedが返されます。find()は配列全体を走査しますが、条件に一致する要素が見つかった時点で処理を終了するため、効率的に目的の要素を取得できるのが特徴です。find()の基本構文array.find(function(val, index, arr), thisValue)パラメータの説明function:各要素に対して実行されるテスト関数val:現在処理中の要素の値(必須)index:現在処理中の要素のインデックス番号
-
JavaScriptのArray.prototype.find()メソッドとは?使い方をサンプルコードで解説
Array.prototype.find() メソッドは、配列の中から指定した条件(テスト関数)を満たす最初の要素の値を返します。 条件に一致する要素が見つかった時点で検索を終了するため、大きな配列でも効率的に動作します。また、どの要素も条件を満たさなかった場合は undefined を返すという点も重要な特徴です。 find()メソッドの基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback:各要素に対して実行されるテスト関数。true を返した要素が結果となります。 thisArg(省略可):callb