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

JavaScriptで2つの配列の中身が同じかどうかを判定する方法(順序を無視して比較)

数値からなる2つの配列、例えば次のようなものを考えてみましょう。

[2, 4, 6, 7, 1]
[4, 1, 7, 6, 2]

ここでは、要素の並び順に関係なく、両方の配列が同じ要素を含んでいるかどうかを判定し、結果をブール値(true / false)で返す関数を作成します。

例えば [2, 4, 6, 7, 1][4, 1, 7, 6, 2] は、含まれる要素は同じでも順序が異なるため、この関数は true を返すべきです。

基本的な実装方法

考え方はシンプルです。まず両配列の長さを比較し、一致していなければ false を返します。その後、片方の配列の各要素がもう片方の配列に含まれているかを includes() メソッドで確認していきます。

コード例

const first = [2, 4, 6, 7, 1];
const second = [4, 1, 7, 6, 2];

const areEqual = (first, second) => {
    // 長さが異なれば同じ要素集合にはなり得ない
    if (first.length !== second.length) {
        return false;
    }
    
    // first の各要素が second に存在するか確認
    for (let i = 0; i < first.length; i++) {
        if (!second.includes(first[i])) {
            return false;
        }
    }
    
    return true;
};

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

出力結果

コンソールには次のように表示されます。

true

注意点:重複する要素の扱い

上記の方法は簡潔で分かりやすい反面、重複した要素の個数までは考慮されないという弱点があります。例えば [1, 1, 2][1, 2, 2] のように、長さが同じで互いの要素をすべて含んでいる場合、実際には内容が異なるにもかかわらず true と判定されてしまいます。

重複数まで厳密に比較したい場合は、両方の配列をソートしてから要素ごとに比較する方法が確実です。

const areEqualStrict = (first, second) => {
    if (first.length !== second.length) {
        return false;
    }
    
    // 元の配列を壊さないようコピーしてソート
    const sortedFirst = [...first].sort((a, b) => a - b);
    const sortedSecond = [...second].sort((a, b) => a - b);
    
    return sortedFirst.every((val, index) => val === sortedSecond[index]);
};

console.log(areEqualStrict([1, 1, 2], [1, 2, 2])); // false
console.log(areEqualStrict([2, 4, 6, 7, 1], [4, 1, 7, 6, 2])); // true

まとめ

・順序を無視して配列を比較する場合は、まず「長さの一致」を確認し、その後 includes() などで要素の存在をチェックするのが基本。
・ただし includes() ベースの方法は重複数を区別できないため、厳密な比較が必要な場合はソート後の比較を利用するとよい。

  1. C#で2つのBitArrayオブジェクトが等しいかどうかを確認する方法

    C#で2つのBitArrayオブジェクトが等しいかどうかを確認するには、Equals()メソッドを使用します。このメソッドは、引数に渡されたオブジェクトが現在のインスタンスと等しい場合にtrueを、そうでない場合にfalseを返します。なお、BitArrayクラスはEquals()メソッドをオーバーライドしていないため、比較は参照(同一インスタンスかどうか)に基づいて行われる点に注意が必要です。以下の例でその挙動を確認してみましょう。例1:同じ参照を持つBitArrayの比較using System; using System.Collections; public class Demo {

  2. C#で2つのシーケンスが等しいかどうかを確認する方法(SequenceEqualメソッド)

    SequenceEqualメソッドとはC#のLINQに含まれるSequenceEqualメソッドは、2つのコレクション(シーケンス)が等しいかどうかを判定するために使用されます。このメソッドは、両方のシーケンスの要素数が同じで、かつ同じ順序で同じ要素が並んでいる場合に True を返し、それ以外の場合は False を返します。比較対象となるシーケンスの準備まず、比較に使用する文字列配列を用意します。string[] arr1 = { This, is, it };string[] arr2 = { My, work, report };string[] arr3 = { This, is,