JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列から回文(パリンドローム)要素だけを抽出する方法

本記事では、文字列と数値が混在した配列を受け取り、その中から回文(パリンドローム)となっている要素だけを集めたサブ配列を返すJavaScript関数の作り方を解説します。

やりたいこと

たとえば、次のような入力配列があったとします。

const arr = ['carecar', 1344, 12321, 'did', 'cannot'];

この場合、期待される出力は以下のとおりです。

const output = [12321, 'did'];

'carecar' や 'cannot' は前後逆に読んでも同じにならないため除外され、数値の 12321 と文字列の 'did' のみが結果に残ります。

実装の考え方

実装は次の2ステップで行います。

  1. 回文判定用のヘルパー関数を作成する。引数として数値または文字列を受け取り、それが回文かどうかを真偽値で返します。
  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 ループ内では左右のポインタ ij を中央に向かって進めながら1文字ずつ比較します。
  • 大文字・小文字を区別せずに判定したい場合は、比較前に str.toLowerCase() を適用するとよいでしょう。

このように、シンプルなヘルパー関数と filter() を組み合わせるだけで、配列から回文要素を簡単に抽出できます。

  1. JavaScriptで配列の要素をすべて奇数に変換する方法

    問題 配列を受け取り、その各要素を次のルールに従って変換するJavaScript関数を作成することを考えます。 数値が奇数の場合 → そのままの値を保持する 数値が偶数の場合 → 1を引いて奇数に変換する そして最後に、変換後の新しい配列を返します。 コード例 以下が実際のコードです。 const arr = [5, 23, 6, 3, 66, 12, 8]; const reduceToOdd = (arr = []) => {     const res = [];     for(let i =

  2. 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番目の要素(