【TypeScript】多次元配列の使い方10選

TypeScriptの多次元配列のイラストとサンプルコードTypeScript
この記事は約17分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

TypeScriptは、JavaScriptに静的な型情報を追加することで、大規模なアプリケーション開発や複雑な処理を安全に、そして効率よく進めることができる言語として注目されています。

そのTypeScriptの中で、特に初心者や中級者が扱いが難しいと感じるのが「多次元配列」です。

この記事では、TypeScriptでの多次元配列の使い方を、基本から応用まで、10の詳細なサンプルコードを通じて徹底的に解説していきます。

また、それぞれのサンプルコードには、そのコードの詳細な説明や実行結果も併せて紹介します。

初心者から中級者まで、TypeScriptでの多次元配列の使い方をマスターするための情報が満載です。

しっかりとした知識と実践的なスキルを身につけて、TypeScriptのコーディングをさらにステップアップさせましょう!

●TypeScriptの多次元配列とは

TypeScriptは、JavaScriptのスーパーセットとして知られており、静的型付けやインターフェースなどの強力な機能を提供します。

この強力な機能の中に、多次元配列も含まれています。

多次元配列は、配列の中にさらに配列を持つデータ構造で、数学の行列や3Dグラフィックスなど、さまざまなアプリケーションで使用されることが多いです。

多次元配列は、単純に考えれば「配列の配列」という形で表現されます。

例えば、二次元配列は、行と列を持つ表のような形になります。

三次元配列は、立方体のような形で、深さが追加されます。

○多次元配列の基本概念

TypeScriptにおける多次元配列の基本的な宣言方法は、単純な配列の型宣言に続けて再び[]を付けることで表現されます。

つまり、二次元の数値配列はnumber[][]という型で宣言され、三次元の数値配列はnumber[][][]という型で宣言されます。

次に、この基本的な概念を使用して実際のサンプルコードを見てみましょう。

●多次元配列の作成方法

TypeScriptで効率的なデータ管理を行うためには、多次元配列の作成方法を理解することが欠かせません。

ここでは、まず基本となる二次元配列の初期化から始め、その後どのようにして多次元配列にアクセスし操作するかを、実際のサンプルコードと共に解説していきます。

それでは、二次元配列を効率的に初期化する方法を見ていきましょう。

○サンプルコード1:二次元配列の初期化

このコードでは、二次元配列を初期化しています。

この例では、3行2列の数値配列を作成しています。

let matrix: number[][] = [
  [1, 2],
  [3, 4],
  [5, 6]
];

// 行と列の数値を表示する
console.log(matrix[0][0]);  // 1
console.log(matrix[1][1]);  // 4

このコードを実行すると、matrix[0][0]は1を、matrix[1][1]は4を返します。

○サンプルコード2:多次元配列の要素へのアクセス方法

多次元配列の要素へのアクセスも、単純な配列と同じようにインデックスを使用します。

この例では、先ほどの二次元配列の要素にアクセスして、その値を変更しています。

// 先ほどのmatrixを使用
matrix[2][0] = 10;

// 変更された値を表示
console.log(matrix[2][0]);  // 10

上記のコードを実行すると、matrix[2][0]の値は10に変更されています。

●多次元配列の活用法

TypeScriptにおける多次元配列は、数学や物理学、統計学などのさまざまな分野での計算やデータ解析、ゲーム開発やグラフィクス処理など、多くのアプリケーションで活用される強力なツールです。

このセクションでは、TypeScriptを使用した多次元配列の実用的な活用方法を、サンプルコードを交えて解説します。

○サンプルコード3:二次元配列を使用した行列の加算

このコードでは、二次元配列を使って2つの行列を加算する方法を表しています。

この例では、3×3のサイズの行列2つを加算して、結果を新しい行列として生成しています。

// 行列A (3x3)
let matrixA: number[][] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 行列B (3x3)
let matrixB: number[][] = [
    [9, 8, 7],
    [6, 5, 4],
    [3, 2, 1]
];

// 行列の加算結果を格納する空の二次元配列を作成
let resultMatrix: number[][] = Array(3).fill([]).map(_ => Array(3).fill(0));

// 行列の加算処理
for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {
        resultMatrix[i][j] = matrixA[i][j] + matrixB[i][j];
    }
}

// 結果の表示
console.log(resultMatrix);

このサンプルコードは非常にシンプルですが、二次元配列の基本的な操作を理解する上で非常に役立ちます。

具体的には、二次元配列の要素にアクセスするための二重のforループの使用方法や、二次元配列の各要素を操作する基本的なテクニックを紹介しています。

行列の加算を実行すると、次のような結果が得られます。

それぞれの行列の対応する位置の要素が加算され、新しい行列が生成されます。

[
 [10, 10, 10],
 [10, 10, 10],
 [10, 10, 10]
]

この例は、二次元配列を使用した基本的な行列の加算に過ぎませんが、この基本的な操作をベースに、さまざまな複雑な行列演算やデータ処理を行うことができます。

○サンプルコード4:三次元配列を用いたデータの管理

TypeScriptにおける多次元配列の中で、三次元配列は特にユニークな存在となります。

多くのアプリケーションにおいて、二次元配列でのデータの管理や操作が一般的ですが、三次元配列はより複雑なデータ構造や特定のアプリケーションでの利用が求められる場面があります。

このコードでは、TypeScriptを使って三次元配列を定義し、その要素にアクセスする方法を表しています。

この例では、商品の在庫管理を三次元配列で表現して、店舗、商品カテゴリ、商品の3つの次元を持つデータ構造を考えてみました。

// 三次元配列の定義
let stock: number[][][] = [
  // 店舗1の在庫
  [
    [10, 15, 20], // カテゴリAの商品
    [5, 8, 12],  // カテゴリBの商品
  ],
  // 店舗2の在庫
  [
    [7, 9, 11],  // カテゴリAの商品
    [6, 7, 9],   // カテゴリBの商品
  ]
];

// 店舗1のカテゴリAの第1商品の在庫を取得
let itemStock = stock[0][0][0];
console.log(`店舗1のカテゴリAの第1商品の在庫数は${itemStock}個です。`);

上記のサンプルコードでは、stockという名前の三次元配列を定義しています。

この三次元配列は、店舗、商品カテゴリ、商品の3つの次元を持っており、それぞれの商品の在庫数を保持しています。

例として、stock[0][0][0]は店舗1、カテゴリA、第1商品の在庫数を参照しています。

実際に上記のコードを実行すると、「店舗1のカテゴリAの第1商品の在庫数は10個です。」というメッセージが出力されることになります。

○サンプルコード5:多次元配列とループの組み合わせ

TypeScriptで多次元配列を扱う上で、その要素に一括でアクセスしたい場面が多々あります。

このような場面でループを組み合わせることで、効率的にデータの処理や取得が行えます。

このコードでは、二次元配列とループの組み合わせを使って、配列内のデータをすべて取得して表示するコードを表しています。

この例では、forループを二重に使用して、二次元配列の要素を順番に取得して表示しています。

const matrix: number[][] = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

for (let i = 0; i < matrix.length; i++) {
  for (let j = 0; j < matrix[i].length; j++) {
    console.log(`matrix[${i}][${j}]の値は${matrix[i][j]}です。`); // matrixの各要素を表示
  }
}

上記のサンプルコードを実行すると、console.logを通じて、二次元配列のすべての要素が順に表示されます。具体的には「matrix[0][0]の値は1です。」といった形式で、最後の要素まで表示されます。

ループを使うことのメリットは、大量のデータにも柔軟に対応できる点にあります。

例えば、上記の二次元配列が100×100のサイズになったとしても、同じループの構文ですべての要素にアクセスすることが可能です。

応用例として、二次元配列のすべての要素の合計を計算する場面を想像してみてください。

この時も、同様の二重のループを使用して要素にアクセスし、合計値を計算することができます。

let total = 0; // 合計値を0で初期化
for (let i = 0; i < matrix.length; i++) {
  for (let j = 0; j < matrix[i].length; j++) {
    total += matrix[i][j]; // 各要素の値を合計に加算
  }
}
console.log(`二次元配列のすべての要素の合計は${total}です。`);

このコードを実行すると、合計値45が出力されます。このように、ループを使うことで、多次元配列のデータを効率よく処理することができます。

●多次元配列の注意点と対処法

TypeScriptで多次元配列を利用するとき、注意すべき点やトラブルの原因になることがいくつかあります。

これらの問題を未然に防ぐため、そして問題が発生した際に迅速に対処するための方法を知っておくことは非常に重要です。

ここでは、TypeScriptでの多次元配列の注意点と、それに対する解決策を詳しく解説していきます。

○サンプルコード6:不規則な多次元配列の扱い

多次元配列は、配列の中にさらに配列を持つ構造になっています。

しかし、中の配列の長さが一定でない場合、それは不規則な多次元配列と呼ばれます。

このような配列の扱いは少し注意が必要です。

このコードでは不規則な多次元配列を扱う方法を表しています。

この例では、外側の配列の各要素が異なる長さの配列を持っているという状況を想定しています。

let irregularArray: number[][] = [
    [1, 2, 3],
    [4, 5],
    [6],
    [7, 8, 9, 10]
];

for (let i = 0; i < irregularArray.length; i++) {
    for (let j = 0; j < irregularArray[i].length; j++) {
        console.log(irregularArray[i][j]);  // 各要素を出力
    }
}

このコードは、不規則な多次元配列の各要素にアクセスして、その内容を出力しています。

ループの際に、内側のループの回数を外側の配列の要素の長さに合わせて動的に変更していることに注意してください。

このように書かれたコードを実行すると、1から10までの数字が順に出力されます。

実際に不規則な多次元配列を扱う際には、このような配列の各要素の長さを正確に把握し、適切なループの回数を設定することが必要になります。

○サンプルコード7:型安全を意識した多次元配列の定義

TypeScriptの強みの一つは、型システムを備えていることです。

このため、多次元配列を扱う際にも、型を明示的に指定して、コードの型安全を確保することが可能です。

このコードでは、型安全を意識して多次元配列を定義する方法を表しています。

この例では、stringの二次元配列を定義し、その要素に文字列のみを格納しています。

let matrix: string[][] = [
    ["a", "b"],
    ["c", "d"],
    ["e", "f"]
];

// 要素へのアクセス
let element = matrix[1][0]; // "c"という値が取得される
console.log(element);

このコードを実行すると、”c”という文字列が出力されます。

このように、TypeScriptでは多次元配列の要素の型を明示的に指定することで、その配列の中に異なる型の値が混入することを防ぐことができます。

TypeScriptで多次元配列を使う際には、このように型を明示的に指定し、コードの安全性を高めることをおすすめします。

●応用例:より複雑な操作

TypeScriptを使用して、多次元配列の使い方をマスターする上で、実践的な応用例を学ぶことは非常に役立ちます。

ここでは、多次元配列を活用したより複雑な操作に焦点を当て、ゲームボードの制作から関数との組み合わせ、データのJSON形式での出力まで、さまざまなシナリオを詳しく解説していきます。

○サンプルコード8:多次元配列を用いたゲームボードの制作

このコードでは、5×5のゲームボードを二次元配列を使用して作成し、プレイヤーの位置を示す方法を表しています。

この例では、ゲームボードの初期化とプレイヤーの移動を実装しています。

// ゲームボードの初期化
let gameBoard: string[][] = [];
for(let i = 0; i < 5; i++) {
    gameBoard[i] = new Array(5).fill("-");
}
// プレイヤーの初期位置
let playerPosition = {x: 0, y: 0};
gameBoard[playerPosition.y][playerPosition.x] = "P";

// プレイヤーを右に移動
playerPosition.x++;
gameBoard[playerPosition.y][playerPosition.x] = "P";

// ゲームボードの表示
for(let row of gameBoard) {
    console.log(row.join(" "));
}

プレイヤーは”P”としてゲームボード上に表示され、初期位置は左上隅の(0,0)です。プレイヤーを右に移動するためには、x座標を1つ増やします。

そして、新しい位置に”P”を設定して、ゲームボードを更新します。

この方法を使用すると、プレイヤーの位置を自由に変更することができ、ゲームのロジックに合わせて拡張することも可能です。

上記のコードを実行すると、プレイヤーがゲームボード上の2列目に移動した結果を確認できます。

具体的には、最初の行の2番目の位置に”P”が表示されるため、プレイヤーの移動が正確に反映されていることがわかります。

○サンプルコード9:多次元配列と関数を組み合わせた処理

多次元配列と関数を組み合わせることで、配列に対する複雑な操作を簡単に実装することができます。

このコードでは、二次元配列内の特定の数値を検索し、その位置を返す関数を表しています。

この例では、指定した数値を検索して、その座標を返す機能を持つ関数を実装しています。

function findNumberPosition(matrix: number[][], target: number): {x: number, y: number} | null {
    for(let y = 0; y < matrix.length; y++) {
        for(let x = 0; x < matrix[y].length; x++) {
            if(matrix[y][x] === target) {
                return {x, y};
            }
        }
    }
    return null;
}

let sampleMatrix: number[][] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

let result = findNumberPosition(sampleMatrix, 5);
if(result) {
    console.log(`数値${5}は、x座標${result.x}、y座標${result.y}の位置にあります。`);
} else {
    console.log(`数値${5}は、この配列内には存在しません。`);
}

findNumberPosition関数は、指定した数値が二次元配列内に存在する場合、その数値の座標を返します。存在しない場合はnullを返します。

この関数を使用すると、任意の数値の位置を迅速に特定することができます。

上記のコードを実行すると、「数値5は、x座標1、y座標1の位置にあります。」という結果が得られます。

これにより、数値5が二次元配列の中央に位置していることが確認できます。

○サンプルコード10:多次元配列のデータをJSON形式で出力

多次元配列はデータ構造として非常に便利であり、そのデータを他のシステムやサービスと共有する際には、JSON形式での出力が一般的です。

JSON(JavaScript Object Notation)は、データ交換のための軽量なデータフォーマットであり、多くのプログラム言語でサポートされています。

TypeScriptにおいても、JSON形式での出力は簡単に行うことができます。

このコードでは、多次元配列のデータをJSON形式に変換して出力する方法を表しています。

この例では、二次元配列を持つオブジェクトを定義し、それをJSON形式に変換して出力しています。

// 二次元配列を持つオブジェクトの定義
const data = {
    matrix: [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
};

// オブジェクトをJSON形式に変換
const jsonOutput = JSON.stringify(data);

// JSON形式のデータを出力
console.log(jsonOutput);

JSON.stringifyメソッドを使用して、オブジェクトをJSON形式の文字列に変換します。

このメソッドはJavaScriptおよびTypeScriptの組み込み関数であり、オブジェクトを受け取ってそのオブジェクトを表現するJSON形式の文字列を返します。

このサンプルコードを実行すると、次のような結果が得られます。

コードを実行すると、次の出力が得られることが期待されます。

{"matrix":[[1,2,3],[4,5,6],[7,8,9]]}

このように、二次元配列がJSON形式に正しく変換され、オブジェクトのプロパティ名としてmatrixが使用されていることが確認できます。

このJSON形式のデータは、他のシステムやサービスとのデータのやりとり、あるいはファイルとしての保存など、様々な用途で使用することができます。

応用例として、このJSONデータを外部APIに送信する場面や、ローカルストレージに保存する場面などを想像することができます。

また、必要に応じてJSON形式のデータを再度TypeScriptのオブジェクトに変換することも可能です。

そのため、データの受け渡しや保存の際にJSON形式の利用は非常に役立ちます。

まとめ

TypeScriptにおける多次元配列の使い方は、初心者から中級者までさまざまな局面で非常に有用です。

今回は10の具体的なサンプルコードを取り上げましたが、これらの基本的な考え方や手法をもとに、さらなる応用やカスタマイズが可能です。

例えば、大きなデータセットを効率的に処理するためのアルゴリズムの実装や、複雑なビジネスロジックを持つアプリケーションの開発など、多次元配列の知識を活かすことでさまざまな課題に取り組むことができます。

TypeScriptの強力な型システムをフルに活用し、多次元配列を安全かつ効果的に扱うことで、より質の高いコードの実装が可能となります。

これからも、TypeScriptの多次元配列の知識を深め、さらなるスキルアップを目指してください。