[GAS] 配列の次元数を調べるスニペット
概要
1 次元配列か 2 次元配列かを判定したいなー、そうそう、 array[0].length の 暗黙の型変換で調べれば一発だったよね、って記憶違いをしていたので、メモ。
まとめとコード
テストはミニマムでやりましょう。
function myFunction() { const a1 = [1, 2, 3]; const a2 = [[1], [2], [3]]; console.log(a1[0].length); // undefined console.log(a2[0].length); // 1 }
うんうん、やっぱりそうだよねって、本番の 1 次元配列のコードだと、 false が返ってこない。 違うのは、配列の中身が数値型か文字列型かってとこくらい。 文字列でも一緒だろうけど、念の為にテストを。
function myFunction() { const a1 = ['あ', 'い', 'う']; const a2 = [['あ'], ['い'], ['う']]; console.log(a1[0].length); // 1 console.log(a2[0].length); // 1 }
なんか、思ってたんと違う...。 気を取り直して、テストを。
function myFunction() { const a1 = ['あ', 'い', 'う']; console.log(a1[0]); // あ console.log(a1[0].length); // 1 console.log(a1[0][0]); // あ console.log(a1[0][0].length); // 1 console.log(a1[0][0][0]); // あ console.log(a1[0][0][0].length); // 1 console.log(a1[0][0][0][0]); // あ console.log(a1[0][0][0][0].length); // 1 console.log(a1[0][0][0][0][0]); // あ console.log(a1[0][0][0][0][0].length); // 1 }
なるほど、文字列「あ」は、どこまで次元を掘り下げても「あ」であり続けられることが推測できるな。 違う、欲しいのはそこじゃない。 アプローチを変えよう、今回の配列だと、純粋な文字列「あ」になった時点、すなわち配列でなくなった時点が確認できればいい。 typeof 演算子を使ったアプローチに切り替えました。
function myFunction() { const a1 = ['あ', 'い', 'う']; const a2 = [['あ'], ['い'], ['う']]; console.log(numDimensions_(a1)); // 1 console.log(numDimensions_(a2)); // 2 } function numDimensions_(array) { let count = 0; while (typeof array === 'object') { count++; array = array[0]; } return count; }
これでバッチリ。 ただ、これだと、次元を掘り下げていった場合の 1 番目の要素でしか判定ができない。実用では問題ないけど、関数名に numDimensions とつけてしまった以上、引き下がれない。 きっとあれだ、判定後の配列要素だけを filter して、それを 1 次元下げたものに map してやれば問題ないよね。 空の要素だけになった場合の対策も入れておけば完璧かな。
function myFunction() { const a1 = [['あ'], [[[['い']]]], [['う']]]; console.log(numDimensions_(a1)); // 4 } function numDimensions_(array) { let count = 0; while (typeof array === 'object') { count++; if (!array.length) break; array = array .filter(e => typeof e[0] === 'object') .map(e => e[0]); } return count; }
完璧!(たぶん
















