配列同士の要素を比較するプログラムを書いてプルリクした際、レビューでもっといい方法を教えて頂いたのでメモです!
具体的には、下記のとおり、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]を比較したときには【中身の要素は同じ】という結果になります。