JavaScriptでのオブジェクトの同値判定
JavaScriptでオブジェクトのプロパティが同一であることを判定したくなった。
具体的には,Web API経由で取得したデータをオブジェクトにそのまま格納し,それがフォームの入力と比較して,デフォルト値から変更されたかどうかで,ボタンの有効・無効を切り替えるなどの判定で必要になった。
JavaScriptは論理値,数値,文字列以外,基本的に全てオブジェクトであり,オブジェクト同士を等価演算子 (===
) で比較すると,それはメモリーのアドレス同士の比較になってしまい,オブジェクトのプロパティの比較にならない。
Javaのequalsメソッド相当のものがあれば簡単なのだが,どうやら標準ではそのようなものはないらしい。
そこで,自分で実装したので実装例を紹介する。GitHubでも公開している。
equal.js
/**
* データが同じ値であることを確認する。
* @param {Object} object1 - 比較対象オブジェクト1。
* @param {Object} object2 - 比較対象オブジェクト2。
* @return {boolean} データが同じ値であればtrue、それ以外はfalseを返す。
*/
function equal(object1, object2) {
if (object1 === object2) {
return true;
} else if (typeof object1 !== 'object' || typeof object2 !== 'object') {
return object1 === object2;
} else if (Object.keys(object1).length !== Object.keys(object2).length) {
return false;
}
for (const key in object1) {
if (!(key in object2)) {
return false;
}
if (!this.equal(object1[key], object2[key])) {
return false;
}
}
return true;
}
シンプルな関数で,引数に比較したいオブジェクトを2個指定して実行する。オブジェクト以外のプリミティブ型にも対応している。
実装は,オブジェクトのプロパティを1個ずつ比較していき,プロパティにオブジェクトがあれば,再帰するという愚直な実装になっている。
JavaScriptでのオブジェクトの同値判定は頻出処理に思うので,こちらで記した内容をいろいろ使いまわしたい。
リンク