TypeScriptで多次元配列を初期化する4つの方法と、それぞれのメリット・デメリットを徹底解説!
TypeScriptにおける多次元配列の初期化
ネストした配列リテラル
最も基本的な方法は、ネストした配列リテラルを使用する方法です。
let matrix: number[][] = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
この方法では、各次元の要素を個別に列挙する必要があります。そのため、要素数が多い場合や、規則的なパターンを持つ場合などは記述が冗長になることがあります。
利点:
- シンプルで分かりやすい
- コードの意図が明確
- 要素数が多い場合や、規則的なパターンを持つ場合などは記述が冗長
- 複雑な構造の多次元配列を初期化する場合には、コードが読みづらくなる
Array.fill()
メソッドを使用して、すべての要素を同じ値で初期化することができます。
let matrix: number[][] = Array.fill(Array(3), 0);
この方法は、すべての要素を同じ値で初期化したい場合に便利です。ただし、異なる値を持つ要素を個別に設定することはできません。
- すべての要素を同じ値で初期化したい場合に簡潔
- コードが読みやすい
- 異なる値を持つ要素を個別に設定することはできない
Array.prototype.map()
メソッドを使用して、各要素を個別に初期化することができます。
let matrix: number[][] = Array.from({ length: 3 }, () => Array(3).fill(0));
matrix = matrix.map((row) => row.map((_, i) => i));
この方法は、各要素を個別に設定したい場合に便利です。ただし、ネストしたループが必要になるため、コードが複雑になることがあります。
- 各要素を個別に設定できる
- コードが複雑になる
- ネストしたループが必要
ライブラリを使用する
lodash
や fp-ts
などのライブラリを使用すると、より簡潔に多次元配列を初期化することができます。
import * as _ from 'lodash';
let matrix: number[][] = _.fill(Array(3), Array(3).fill(0));
matrix = matrix.map((row) => _.range(3).map((i) => i));
ライブラリを使用すると、コードが簡潔になり、可読性も向上します。ただし、ライブラリの使用方法を覚える必要があるという欠点があります。
- 可読性が高い
- ライブラリの使用方法を覚える必要がある
TypeScript で多次元配列を初期化するには、さまざまな方法があります。それぞれの方法の特徴と利点・欠点を理解し、状況に応じて適切な方法を選択することが重要です。
- 型推論を利用することで、型宣言を省略することができます。
let matrix: number[][] = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
let row = [1, 2, 3];
let matrix: number[][] = [row, row, row];
TypeScriptにおける多次元配列の初期化 - サンプルコード
ネストした配列リテラル
let matrix1: number[][] = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
Array.fill() メソッド
let matrix2: number[][] = Array.fill(Array(3), 0);
このコードは、3行3列の2次元配列 matrix2
を初期化し、すべての要素を 0 で初期化します。
Array.prototype.map() メソッド
let matrix3: number[][] = Array.from({ length: 3 }, () => Array(3).fill(0));
matrix3 = matrix3.map((row) => row.map((_, i) => i));
ライブラリを使用する(Lodash)
import * as _ from 'lodash';
let matrix4: number[][] = _.fill(Array(3), Array(3).fill(0));
matrix4 = matrix4.map((row) => _.range(3).map((i) => i));
このコードは、Lodash ライブラリを使用して、3行3列の2次元配列 matrix4
を初期化し、すべての要素を 0 で初期化します。その後、各要素をインデックスで初期化します。
let matrix5: number[][] = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
let row = [1, 2, 3];
let matrix6: number[][] = [row, row, row];
これらのサンプルコードは、TypeScript で多次元配列を初期化する方法を理解するための出発点として役立ちます。状況に応じて適切な方法を選択してください。
TypeScriptにおける多次元配列の初期化 - その他の方法
ジェネレータを使用して、多次元配列を効率的に初期化することができます。
function* generateMatrix(rowCount: number, columnCount: number): Generator<number[][]> {
for (let i = 0; i < rowCount; i++) {
yield Array.from({ length: columnCount }, (_, j) => i * columnCount + j + 1);
}
}
let matrix: number[][] = [...generateMatrix(3, 3)];
- メモリ使用量が少ない
- ジェネレータの使用方法を理解する必要がある
function createMatrix(rowCount: number, columnCount: number, row: number = 0, matrix: number[][] = []): number[][] {
if (row === rowCount) {
return matrix;
}
matrix[row] = Array.from({ length: columnCount }, (_, i) => row * columnCount + i + 1);
return createMatrix(rowCount, columnCount, row + 1, matrix);
}
let matrix: number[][] = createMatrix(3, 3);
- スタックオーバーフローが発生する可能性がある
let [row1, row2, row3] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
let matrix: number[][] = [row1, row2, row3];
上記以外にも、多次元配列を初期化する方法があります。例えば、JSON 文字列をパースしたり、CSV ファイルを読み込んだりする方法もあります。
最適な方法は、初期化する多次元配列の構造と、必要な機能によって異なります。
multidimensional-array typescript