オブジェクト/配列の比較
Why????bsahd.icon
https://gyazo.com/b9ecc11d024f08cdf5cdf5344632bf61
別のobjectだからtakker.icon
中身が同じでも、いわゆる参照が違えば違うobjectになる
これはJS Is Weirdなのではなくここ20年くらいの言語のほとんどがいろいろな形で似た現象を引き起こすんだよな〜nishio.icon
Pythonの場合は値を比較する==とオブジェクトの同一性を比較するisを分けることにした
code::
In []: {"a": 1} == {"a": 1}
Out[]: True
In []: {"a": 1} is {"a": 1}
Out[]: False
むしろ配列やオブジェクトをそのまま比較した時に、参照比較ではなく値の比較してくれる言語そんなに多くない気がするMijinko_SD.icon
参照比較が直感的ではなく、使う場面も値比較に比べてそこまで多くないのはわかるけど
JS の比較はもっとヒドイぞSummer498.icon
"1" == 1 が true
左辺が文字列、右辺が数やから true / false 以前に型エラーで弾いてくれって思うけど true なんだわ
あとオブジェクトの値比較はしないけど、TS の型の判定はメンバで判定するの納得いかねぇなSummer498.icon
https://gyazo.com/40f48f067037ff1cd7f836068aef5664
対処法:JSONにして比較する
いやがらせをするnishio.icon
https://gyazo.com/3d3b127fddda5a28e85fecd144260c94
function sort(t){return Object.fromEntries(Object.entries(t).sort((x,y)=>{var w=x[0],z=y[0];if(w<z){return -1;}if(w>z){return 1;}return 0;}))}
const deepEqual = (a, b) => typeof a !== typeof b ? false : Array.isArray(a) ? a.every((value, key) => deepEqual(b[key], value)) : typeof a !== "object" ? a === b : Object.entries(a).every(([key, value]) => deepEqual(b[key], value));でいけるかと思ったけど、SetやMap, symbolのことを考慮してないから不十分かtakker.icon
意外とむずかしい
JSONだって対応してないはずだから大丈夫bsahd.icon
対処法2 : lodashにisEqualってあった気がする綾坂こと.icon
正直なんでもいいと思う
内部的にはオブジェクト分を動的確保して変数領域にはポインタを入れてる
最近こういうことが必要になる場面に出くわしてないなtakker.icon
JS書きはじめのころはだいぶ悩んだ気がする
比較しなくて済むような処理方法で無意識に書いてるのかも
逆にオブジェクトそのものを比較したい場面ってなんだろMijinko_SD.icon
大抵の場合、オブジェクトに主キーを持たせておけばそいつの比較だけで事足りる
むしろオブジェクト全体を見ないと一意性を保てない設計はちょっとまずい気がする 一意性を確かめる際に一々全オブジェクトの比較をしないといけなくなるので
差分があるかを調べる際にオブジェクトの同値性を比較することはある