Blog Post

JavaScript 配列等価比較 3選


作成日 2023-02-21

目次

概要

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