何に使えるかは全然わからないですが発見したのでメモ。
まず循環参照を持った配列を定義します。
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ずつ増えます。
頑張ればフィボナッチ数列を取得できそうですが、だからなんなんですかね