JavaScriptで配列から回文(パリンドローム)要素だけを抽出する方法
本記事では、文字列と数値が混在した配列を受け取り、その中から回文(パリンドローム)となっている要素だけを集めたサブ配列を返すJavaScript関数の作り方を解説します。
やりたいこと
たとえば、次のような入力配列があったとします。
const arr = ['carecar', 1344, 12321, 'did', 'cannot'];
この場合、期待される出力は以下のとおりです。
const output = [12321, 'did'];
'carecar' や 'cannot' は前後逆に読んでも同じにならないため除外され、数値の 12321 と文字列の 'did' のみが結果に残ります。
実装の考え方
実装は次の2ステップで行います。
- 回文判定用のヘルパー関数を作成する。引数として数値または文字列を受け取り、それが回文かどうかを真偽値で返します。
- Array.prototype.filter() を使って配列を走査し、回文判定が
trueになった要素だけを新しい配列として返します。
回文の判定には、先頭と末尾から同時に文字を比較していく「2ポインタ方式」を採用します。文字列を反転させる方法に比べて、途中で不一致が見つかった時点で即座に false を返せるため効率的です。
サンプルコード
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));実行結果
コンソールには次のように出力されます。
[ 12321, 'did' ]
ポイント解説
String(el)によって数値も文字列へ変換しているため、12321のような数値型の要素も同じロジックで判定できます。- while ループ内では左右のポインタ
iとjを中央に向かって進めながら1文字ずつ比較します。 - 大文字・小文字を区別せずに判定したい場合は、比較前に
str.toLowerCase()を適用するとよいでしょう。
このように、シンプルなヘルパー関数と filter() を組み合わせるだけで、配列から回文要素を簡単に抽出できます。
-
JavaScriptで配列の要素をすべて奇数に変換する方法
問題 配列を受け取り、その各要素を次のルールに従って変換するJavaScript関数を作成することを考えます。 数値が奇数の場合 → そのままの値を保持する 数値が偶数の場合 → 1を引いて奇数に変換する そして最後に、変換後の新しい配列を返します。 コード例 以下が実際のコードです。 const arr = [5, 23, 6, 3, 66, 12, 8]; const reduceToOdd = (arr = []) => { const res = []; for(let i =
-
JavaScriptで複数の配列から要素を交互に取り出して1つの配列にまとめる方法
問題 今回は、任意の個数の配列を引数として受け取り、それらすべての配列から要素を交互に(順番に一つずつ)取り出して、新しい配列を組み立てるJavaScript関数を作成します。 例えば、関数への入力が次のような場合を考えてみましょう。 入力 const arr1 = [1, 2, 3, 4]; const arr2 = [11, 12, 13, 14]; const arr3 = [a, b, c]; 出力 const output = [1, 11, a, 2, 12, b, 3, 13, c, 4, 14]; ご覧のとおり、まず各配列の先頭要素(1、11、a)、次に各配列の2番目の要素(