Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

循環参照がある配列で flat を呼び出すとどんどん長くなる

何に使えるかは全然わからないですが発見したのでメモ。

まず循環参照を持った配列を定義します。

const a = [];
a[0] = a;
a[1] = 0;

これの flat を呼ぶと面白いことが起きます。

console.log(a.flat()); // [ <ref *1> [ [Circular *1], 0 ], 0, 0 ]
console.log(a.flat().flat()); // [ <ref *1> [ [Circular *1], 0 ], 0, 0, 0 ]
console.log(a.flat().flat().flat()); // [ <ref *1> [ [Circular *1], 0 ], 0, 0, 0, 0 ]

なんと、flat を呼び出すごとに配列の末尾に 0 が追加されていきます。ということは a.flat().flat()/* ... */.flat().length - 2 というふうにすれば flat を呼び出した回数がわかります。

…こんなテクニック、いつ使うんですかね?

余談

余談ですが、a[0] = 0; a[1] = a; とすると配列の先頭に 0 が追加されていきます。

console.log(a.flat()); // [ 0, 0, <ref *1> [ 0, [Circular *1] ] ]
console.log(a.flat().flat()); // [ 0, 0, 0, <ref *1> [ 0, [Circular *1] ] ]
console.log(a.flat().flat().flat()); // [ 0, 0, 0, 0, <ref *1> [ 0, [Circular *1] ] ]

さらに余談として、初期状態を長さ 3 にする(a[0] = a; a[1] = a[2] = 0;) と、flat を呼ぶたびに配列の長さが2ずつ増えます。

頑張ればフィボナッチ数列を取得できそうですが、だからなんなんですかね