aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

循環構造をサポートするdeep-equal関数

Open marihachi opened this issue 1 year ago • 11 comments

What

循環構造をサポートするdeep-equalを実装。 連想配列で必要になりそうなのでひとまず追加。 標準ライブラリ等でも使えそう。

~~少し怪しい部分があるので考えたい~~

Why

Additional info (optional)

marihachi avatar Nov 07 '23 12:11 marihachi

良さそう

marihachi avatar Nov 07 '23 13:11 marihachi

constructorとか怪しいかも あと特殊なやつってあったっけ

(Mapなどではない)通常のオブジェクトに任意のキーでユーザーがアクセスすることがなければ大丈夫そうかも

marihachi avatar Nov 07 '23 13:11 marihachi

equal({ a: 1 }, { a: 1, b: 2 })

のように、オブジェクト同士の比較で後者が前者の要素全部+αを持っている時に偽陽になってしまうようです

FineArchs avatar Nov 07 '23 14:11 FineArchs

怪しいのというと

let a, b, c;
a = { b };
b = { c };
c = { a };
let x = { a };
let y = { a: { b } };
equal(x, y); // false

が微妙ですね

FineArchs avatar Nov 07 '23 14:11 FineArchs

怪しいのというと

let a, b, c;
a = { b };
b = { c };
c = { a };
let x = { a };
let y = { a: { b } };
equal(x, y); // false

が微妙ですね

これ修正されてませんか?

marihachi avatar Nov 07 '23 14:11 marihachi

あれ動かない...謎

marihachi avatar Nov 07 '23 14:11 marihachi

あ、テストケースが間違ってますね

a = { b };

の時点ではbはundefinedです 多分

marihachi avatar Nov 07 '23 14:11 marihachi

これだと動きました

let a: any, b: any, c: any;
a = { b };
b = { c };
a.b = b;
c = { a };
b.c = c;
let x = { a };
let y = { a: { b } };
console.log(deepEqual(x, y)); // true

marihachi avatar Nov 07 '23 14:11 marihachi

これだと動きました

let a: any, b: any, c: any;
a = { b };
b = { c };
a.b = b;
c = { a };
b.c = c;
let x = { a };
let y = { a: { b } };
console.log(deepEqual(x, y)); // true

確認できました

FineArchs avatar Nov 07 '23 14:11 FineArchs

let a=[{a:[]}]
let b=[{a:[]}]
a[0].a[0]=a
b[0].a[0]=b[0]

deepEqual(a,b) // true

になるみたいです

FineArchs avatar Mar 13 '24 13:03 FineArchs

循環の判定方法にバグがあるかも 両方が循環した位置だけでは一致を判断できないかも?

marihachi avatar Mar 16 '24 02:03 marihachi