【JavaScript】ネストされた配列の全要素数(ディープカウント)を求める方法
問題:ネストされた配列の全要素数を数える
入れ子(ネスト)構造を持つ配列を受け取り、その中に存在するすべての要素の総数(ディープカウント)を返すJavaScript関数を作成します。
入力
const arr = [1, 2, [3, 4, [5]]];
出力
const output = 7;
出力が7になるのは、第1階層に「1」「2」「[3, 4, [5]]」の3つ、第2階層に「3」「4」「[5]」の3つ、第3階層に「5」の1つの要素が存在し、入れ子の配列そのものも1つの要素としてカウントされるためです。すなわち 3 + 3 + 1 = 7 となります。
サンプルコード
const arr = [1, 2, [3, 4, [5]]];
const deepCount = (arr = []) => {
return arr
.reduce((acc, val) => {
return acc + (Array.isArray(val) ? deepCount(val) : 0);
}, arr.length);
};
console.log(deepCount(arr));コードの解説
Array.prototype.reduce() メソッドを使って配列を順番に走査し、各要素が配列かどうかを Array.isArray() で判定しています。走査の途中で入れ子の配列が見つかった場合は、同じ関数を再帰的に呼び出し、その内側に含まれる要素数も合計に加算していきます。
この実装のポイントは、reduce の初期値として arr.length を渡している点です。まず現在の階層の要素数がベースとしてカウントされ、そこへ再帰処理によって得られたネスト内の要素数が積み上がっていくため、どれだけ深く入れ子になっていても正確な総数を取得できます。
実行結果
7
-
JavaScriptでキューに要素を追加する(エンキュー)方法
キューへの要素追加(エンキュー)とは キューに要素を追加すること(エンキュー)とは、コンテナ配列の末尾に新しい要素を加える操作です。本記事では、配列の末尾をキューの「尾部(tail)」として扱い、すべての挿入操作をこの末尾に対して行います。つまり、先入れ先出し(FIFO)の構造において、新しく入ってくる要素は常に列の最後尾へ並ぶことになります。 この考え方に基づけば、enqueue 関数は次のようにシンプルに実装できます。 実装例:enqueue関数 enqueue(element) { // キューが満杯かどうかをチェック if (this.isFull()) {
-
JavaScriptのオブジェクト配列に配列メソッドを適用する方法
JavaScriptでは、オブジェクトが格納された配列に対しても、通常の配列と同じようにpop()、push()、splice()などの標準的な配列メソッドをそのまま使用できます。オブジェクト配列はあくまで「配列」であるため、要素としてオブジェクトが入っていても配列操作のAPIは共通で動作します。 コード例 以下は、JavaScriptオブジェクトの配列に対して配列メソッドを使用するサンプルコードです。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8