
JavaScript 配列等価比較 3選
目次
概要
Python では配列を等価比較した場合、要素が同一であれば等価とみなします。
JavaScript だとそうはならないです。
> [1,2,3] === [1,2,3]
false
そこで、本記事は要素が同一である時に等価であると判定するために 3 種類の比較方法を紹介します。
JSON stringify
JSON stringify で比較する方法です。
> JSON.stringify([1,2,3])
'[1,2,3]'
> JSON.stringify([1,2,3]) === JSON.stringify([1,2,3])
true
toString メソッド
String 化のメソッドです。 JSON と違うところは JSON 化が目的でないところです。
> [1,2,3].toString()
'1,2,3'
> [1,2,3].toString() === [1,2,3].toString()
true
every メソッド
それぞれの要素を比較する手法です。
const arr = [1,2,3]
> [1,2,3].every((e,i) => e === arr[i])
true
Stringify で OK?
string 化によって解決する手法を紹介しました。
しかし、string 化で必ずしも期待通りの値にならないケースがあります。
例えばクラスを使うと、 toStringメソッドの場合は [object Object]
, JSON.stringify だと 辞書化されたものが出力されます。
> class A2 {a=1;b=2;}
> a2 = new A2()
> a2b = new A2()
A2 { a: 1, b: 2 }
> [1,2, a2].toString()
'1,2,[object Object]'
> JSON.stringify([1,2, a2])
'[1,2,{"a":1,"b":2}]'
> JSON.stringify([1,2, a2]) === JSON.stringify([1,2, a2b])
true
toString だと、クラスに関係なく、 [object Object]
と返すため、正しい判定ができないです。
JSON.stringifyだと、 a2, a2b は同一のオブジェクトではないのに、属性値が同一であるため、同一としてみなされ、オブジェクトの等価は判定できないです。(a2, a2b の属性値比較するなら別ですが)
null, class 系等ある場合、 every メソッド使うといいです。
まとめ
本記事では array の比較を紹介しました。
以上。
参考文献
https://developer.mozilla.org/ Array