【JavaScript】配列内の回文(パリンドローム)を判定して抽出する方法
本記事では、文字列や数値のリテラルを含む配列を受け取り、その中から回文(前から読んでも後ろから読んでも同じ並びになる要素)だけを抜き出したサブ配列を返すJavaScript関数の作成方法を解説します。
やりたいこと
たとえば、入力配列が以下のような場合を考えてみましょう。
const arr = ['carecar', 1344, 12321, 'did', 'cannot'];
この場合、期待される出力は次のとおりです。
const output = [12321, 'did'];
「did」も「12321」も左右反転しても同じ並びになるため回文と判定されます。一方、「carecar」や「cannot」、数値の「1344」は回文ではないため除外されます。
実装のアプローチ
実装の手順はシンプルで、大きく分けて2つのステップで構成されます。
- ヘルパー関数の作成: 数値または文字列を受け取り、それが回文かどうかを真偽値で返す関数
isPalindromeを用意します。内部では要素をいったん文字列に変換し、両端から中央に向かって文字を比較していきます。 - フィルタリング処理: 配列に対して
filter()メソッドを使い、isPalindromeがtrueを返した要素だけを集めた新しい配列を返します。
コード例
実際のコードは以下のとおりです。
const arr = ['carecar', 1344, 12321, 'did', 'cannot'];
const isPalindrome = el => {
const str = String(el);
let i = 0;
let j = str.length - 1;
while(i < j) {
if(str[i] === str[j]) {
i++;
j--;
}
else {
return false;
}
}
return true;
};
const findPalindrome = arr => {
return arr.filter(el => isPalindrome(el));
};
console.log(findPalindrome(arr));コードのポイント
String(el)によって、数値であっても文字列として統一的に扱えるため、数値と文字列が混在する配列に対応できます。- ポインタ
iを先頭から、ポインタjを末尾から動かしながら1文字ずつ比較することで、効率よく回文判定を行えます。不一致が見つかった時点で即座にfalseを返すため、無駄なループが発生しません。 filter()は条件を満たす要素だけで新しい配列を生成するため、元の配列を破壊せずに済みます。
実行結果
上記のコードを実行すると、コンソールには次の出力が表示されます。
[ 12321, 'did' ]
このように、ヘルパー関数と filter() を組み合わせることで、数値・文字列が混在する配列からでも簡潔に回文要素だけを抽出できます。大文字小文字や空白を無視したい場合は、判定前に toLowerCase() や replace(/\s+/g, '') を適用すると応用範囲がさらに広がります。
-
JavaScriptで数値配列内の母音(ASCIIコード)を判定して置換する方法
問題 ここで求められているのは、数値の配列を受け取るJavaScript関数を作成することです。配列の中に、ASCIIコードとして母音(a・e・i・o・u)に該当する数値が存在する場合、その数値を対応する母音の文字に置き換え、変換後の新しい配列を返す必要があります。 考え方 ASCIIコードでは、小文字の母音はそれぞれ「a」= 97、「e」= 101、「i」= 105、「o」= 111、「u」= 117 に対応しています。そこで、String.fromCharCode() を使って各数値を文字に変換し、その文字が母音かどうかを判定すればよいわけです。母音に一致した要素だけを文字へ置き換えます
-
JavaScriptで配列の要素が2乗の関係かどうかをチェックする方法
問題 2つの数値の配列 arr1 と arr2 をそれぞれ第1・第2引数として受け取るJavaScript関数を作成することを考えます。 この関数は、arr2 のすべての要素が、出現順序に関係なく arr1 のいずれかの要素の2乗と一致する場合にのみ true を返し、それ以外の場合は false を返す必要があります。 たとえば、関数への入力が次のようであった場合を考えてみましょう。 入力 const arr1 = [4, 1, 8, 5, 9]; const arr2 = [81, 1, 25, 16, 64]; 出力 const output = true; この場合、81 = 9²、