1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

配列同士の要素を比較する方法

Posted at

配列同士の要素を比較するプログラムを書いてプルリクした際、レビューでもっといい方法を教えて頂いたのでメモです!

具体的には、下記のとおり、Afterの方がより目的(配列同士の要素を比較)に沿った方法になっているということです。
Before → 配列2つを文字列にして一致するかどうかチェック
After → 配列の中身をすべて比較してチェック

やりたいこと

「配列A,Bの要素に差分があるかどうか」を知りたい。
配列内の数字はajaxで通信して取得していて、今の所いつでも昇順で入っている。

やったこと

Before

index.vue
~ 略 ~

methods: {
    isDiffArrays() {
        let arrayA = [1, 2, 3, 4];  // 仮で入れています 実際はfunctionの外からもってきました
        let arrayB = [2, 3, 4, 6]; // 仮で入れています 実際はfunctionの外からもってきました
        return (arrayA.toString() != arrayB.toString());
    }
}

~ 略 ~

いちおう、中身の比較はしていますが、何らかの原因で昇順以外で格納されてしまうと、
例えば[1, 2, 3, 4]==[2, 3, 4, 1]でfalseが返らないという結果にもなり得ます。

After

index.vue
methods: {
    isDiffArrays() {
        let arrayA = [1, 2, 3, 4];  // 仮で入れています 実際はfunctionの外からもってきました
        let arrayB = [2, 3, 4, 6]; // 仮で入れています 実際はfunctionの外からもってきました

        let numOnlyInA = arrayA.filter(i => arrayB.indexOf(i) == -1);
        // 上記の方法でarrayBが持たないarrayAの値(ここでは1)をnumOnlyInAに入れることができます。
        // 同じ方法でarrayAが持たないarrayBの値(ここでは6)をnumOnlyInBに入れます。
        let numOnlyInB = arrayB.filter(i => arrayA.indexOf(i) == -1);

        return ((numOnlyInA.length != 0) || (numOnlyInB.length != 0))
    }
}

この方法なら、配列の要素ひとつひとつをfilterでチェックしているので、
[1, 2, 3, 4]と[2, 3, 4, 1]を比較したときには【中身の要素は同じ】という結果になります。

1
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?