JavaScriptで単一文字の2つの配列を比較して差分を返す方法
本記事では、単一の文字が複数回出現する2つの文字列配列を比較し、その差分(異なる部分)を取得する方法を解説します。
問題の概要
例として、次のような2つの配列を考えます。
const arr1 = ['A', 'C', 'A', 'D']; const arr2 = ['F', 'A', 'T', 'T'];
ここで求められているのは、両配列の同じインデックス位置にある文字同士を1つずつ照合し、一致しなかった要素だけを結果として返す処理です。
ポイントは以下のとおりです。
- 2つの配列のうち短い方の長さまでループして比較を行う
- 位置ごとに値が異なる場合、両方の値を結果配列へ追加する
- どちらか一方が長い場合、余りの部分もすべて差分として含める
実装コード
実際のコードは次のようになります。
const arr1 = ['A', 'C', 'A', 'D'];
const arr2 = ['F', 'A', 'T', 'T'];
const findDifference = (arr1, arr2) => {
// 比較は短い方の配列の長さまで行う
const min = Math.min(arr1.length, arr2.length);
let i = 0;
const res = [];
while (i < min) {
// 同じ位置の文字が異なる場合は両方を結果に追加
if (arr1[i] !== arr2[i]) {
res.push(arr1[i], arr2[i]);
};
++i;
};
// 長さに差がある場合、余りの要素も差分として連結
return res.concat(arr1.slice(min), arr2.slice(min));
};
console.log(findDifference(arr1, arr2));コードの解説
- Math.min() により2つの配列の長さの小さい方を取得し、比較範囲を決定します。
- whileループ内で !==(厳密不等価) を使い、同じ位置の文字が異なれば arr1 と arr2 の両方の値を順に push します。
- 最後に concat() と slice(min) を組み合わせることで、片方の配列がもう片方より長いケースでも、余った要素を漏れなく差分として扱えます。
実行結果
コンソールには次のように出力されます。
[
'A', 'F', 'C',
'A', 'A', 'T',
'D', 'T'
]出力を見ると、最初の要素「A」と「F」は異なるため両方が含まれ、2番目の「A」同士は一致しているため除外され、以降も同様に異なるペアのみが結果に格納されていることがわかります。
まとめ
このように、位置ごとの比較と余剰要素の連結を組み合わせることで、単一文字の配列間の差分をシンプルかつ効率的に求めることができます。配列の長さが異なるケースにも対応できるため、実務でも応用しやすいパターンです。
-
【JavaScript】2つの配列間の文字列の長さにおける最大絶対差を求める方法
問題 2つの文字列の配列 a1 と a2 を引数として受け取るJavaScript関数を作成する必要があります。各文字列は a〜z の英字のみで構成されているものとします。ここで x を1つ目の配列内の任意の文字列、y を2つ目の配列内の任意の文字列としたとき、関数は次の値を求めます。 max(abs(length(x) − length(y))) つまり、別々の配列に属する文字列のペアごとに長さの差の絶対値を計算し、その中で最大となる値を返すという問題です。 解法のポイント すべての文字列の組み合わせに対して二重ループで差を求めることも可能ですが、より効率的なアプローチがあります。絶対差
-
JavaScriptで2つの配列をマージして重複を削除する方法
課題 JavaScriptで、2つの数値の配列 arr1 と arr2 を引数として受け取る関数を作成することを考えます。 この関数は、両方の配列の要素を1つの新しい配列にマージします。マージの前後いずれかの時点で重複する要素が存在した場合には、余分なコピーを削除し、各要素が必ず1回だけ現れるようにしなければなりません。 要素の並び順は厳密には問われませんが、各要素の出現回数(必ず1回であること)が重要なポイントになります。 入力例 const arr1 = [6, 5, 2, 1, 8]; const arr2 = [3, 4, 6, 8, 9]; この場合、期待される出力は次のとおりです。