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

JavaScript(ES6)で大文字小文字と順序を無視して2つの文字列が等しいか比較する方法

本記事では、2つの文字列を引数として受け取り、文字の出現順序や大文字・小文字の違いに関係なく、両者が同じ文字セットを持っているかどうかを判定する関数 isEqual() の実装方法を解説します。

たとえば次のようなケースです。

const first = 'Aavsg';
const second = 'VSAAg';
isEqual(first, second); // true

方法1:配列と sort() を使う方法

この方法では、まず文字列を split("") で配列に変換し、Array.prototype.sort() メソッドで要素を並べ替えます。その後、join("") で再び文字列に戻し、両者が完全に一致するかどうかを比較します。

比較前に toLowerCase() で小文字に統一しておくことで、大文字・小文字の違いを無視できるのがポイントです。

コード例

const first = 'Aavsg';
const second = 'VSAAg';

// 文字列をソート済みの文字列に変換するメソッドを追加
String.prototype.sort = function () {
  return this.split("").sort().join("");
};

const isEqual = (first, second) =>
  first.toLowerCase().sort() === second.toLowerCase().sort();

console.log(isEqual(first, second));

このアプローチはコードが簡潔で読みやすい反面、文字数が多い場合はソートのコスト(O(n log n))が発生します。

方法2:マップ(連想オブジェクト)で文字頻度を集計する方法

こちらはより効率的な手法です。2つの文字列を同時に走査しながら、各文字の出現頻度をマップ(オブジェクト)に記録していきます。

  • 片方の文字列に現れた文字は +1
  • もう片方の文字列に現れた文字は -1

最終的にすべてのキーの値が 0 になっていれば、両者の文字構成が完全に一致していることになります。そうでなければ異なる文字列だと判断できます。

コード例

const first = 'Aavsg';
const second = 'VSAAg';

const isEqual = (first, second) => {
  // 長さが違えば時点で不一致
  if (first.length !== second.length) {
    return false;
  }

  first = first.toLowerCase();
  second = second.toLowerCase();

  const map = {};
  for (let ind in first) {
    if (map[first[ind]]) {
      map[first[ind]]++;   // first 側の出現で +1
    } else {
      map[first[ind]] = 1;
    }
    if (map[second[ind]]) {
      map[second[ind]]--;  // second 側の出現で -1
    } else {
      map[second[ind]] = -1;
    }
  }

  // すべての値が 0 なら true を返す
  return Object.values(map).reduce((acc, val) => val === 0 && acc, true);
};

console.log(isEqual(first, second));

実行結果

どちらの方法でも、コンソールには次のように出力されます。

true

まとめ

方法特徴
配列+sort()コードがシンプル。可読性重視の場合におすすめ
マップで頻度集計線形時間 O(n) で処理可能。長い文字列やパフォーマンス重視の場合に有効

用途やデータサイズに応じて、適切な方法を選択してください。

  1. JavaScriptで2つの配列を結合する方法【concat()とスプレッド構文】

    JavaScriptで2つの配列を1つにまとめたい場合、最も一般的なのが concat() メソッドです。このメソッドは、元の配列を変更することなく、複数の配列や値を連結した新しい配列を返します。 concat()メソッドの基本構文 let 新しい配列 = 配列A.concat(配列B); サンプルコード 以下は、ボタンをクリックすると2つの配列を結合し、その結果を画面に表示する完全なサンプルです。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8&

  2. JavaScriptで2つの配列を乗算する方法|forループとmap()の実装例

    JavaScriptで2つの配列の各要素同士を乗算し、その結果を新しい配列として取得する方法を解説します。基本的にはforループでインデックスを順番に処理しながら、対応する位置にある要素同士を掛け合わせていくシンプルなアプローチです。 2つの配列を乗算するサンプルコード 以下の例では、「CLICK HERE」ボタンをクリックすると、配列 arr と arr1 の対応する要素が乗算され、結果が新しい配列 multArray に格納された上で画面に表示されます。 <!DOCTYPE html> <html lang=en> <head> <meta ch