Help us understand the problem. What is going on with this article?

ブラウザで動作するJavaScriptのdeepEquals(不完全)を書いたけど、fast-deep-equalを使います

More than 1 year has passed since last update.

(不完全)と前置きする感じ、弱気である。

雑にdeepEqualsしたい、という要件があったので。
npmにはもちろん上がっているけど、ブラウザでちょっと試しに使いたい感じだったので、ググってすぐ見つからなかったので書いた。

https://jsfiddle.net/upcme7ob/

対応しているのは、null,undefined,number,string,object,array。
(boolean同士がない事に気づく。「こんなん書かなくてもあってるでしょ」とタカをくくって書いてないですね・・・よくない・・・)

2019-03-26時点のモダンなEdge,Chrome,Firefoxでエラーが出てないことは確認。Safari、モバイルは知らない。
雰囲気で適当なテストを書きながら実装してたので、テストしてないパターンありそう。

Functionからインスタンスを作る感じのやつも多分大丈夫だけど、Functionを作ってるようなものは無理かもしれない。
NaNとかSymbolとかは見てない。循環参照も知らない。こちらからすれば、そんな汚いオブジェクトを作る方が悪い。

他を見てみましょう

こういう書いた系は、いつもある程度満足いくところまで実装してから他の実装見ています。なぜ逆にしないのか。

Node 実装

最初はnodejs実装を参考にしようとしたけど、なんかめんどくさそうだったので諦めた。

NodeJSの実装は以下。setを持ちまわる感じ、循環参照を考慮してる感はある。Symbolも見てるっぽい。よくわからない。

https://github.com/nodejs/node/blob/5f032a7a269b66d48505869b0ae4fb1db403b118/lib/internal/util/comparisons.js#L548

fast-deep-equal

https://www.npmjs.com/package/fast-deep-equal

code: https://github.com/epoberezkin/fast-deep-equal/blob/master/index.js

こちらは1300万DL/weekな実装。テストか何かの依存なんだろうか
何度もオブジェクトを辿らないようにしたり、varを1回で済ませてたり、何度もvarしないように頑張っている感がある。コンパクトだし読みやすい。
export等を削れば自分が用意したテストケースでブラウザ上でも動いた。本番で使うならこっち使います。

node-deep-equal

https://www.npmjs.com/package/deep-equal

code: https://github.com/substack/node-deep-equal/blob/master/index.js

こちら600万DL/weekな実装。名前は一番良い。でもDate型とかも見てるし、なんか読みにくく感じてあまり見てない。

他にもあるみたいだけどどんぐりの背比べのような気がしたので見てない。

真のdeepEqualsを見せてくれる方を募集しております。

fukasawah
開発環境を作って満足するタイプ
https://fukasawah.github.io/
neosystem
「通信業・メディア・ネットベンダー向けシステム」「製造業向けシステム」「金融業向けシステム」「教育機関・企業教育向けシステム」等の開発を手掛ける、独立系の総合SIerです。
http://www.neosystem.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした