[TypeScript]一次元配列を指定のサイズで二次元配列に分割する

2023.02.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • プログラム内で配列が大きくなってくると分割して処理させたくなるケースは多いです。
  • そこで今回はTypeScriptで一次元配列を指定のサイズで二次元配列に分割する方法を記録いたします。

環境

  • mac OS Ventura 13.1
  • typescript 4.9.5

結果

  • 結果のコードは以下の通りです。
// 分割関数
function arrayChunk<T>(array: T[], size: number): T[][] {
    if(size <= 0) return [[]];
    const result = [];
    for(let i = 0, j = array.length; i < j; i += size){
        result.push(array.slice(i, i + size));
    }
    return result;
}

// 対象データ
const data = ["a","b","c","d","e"]

// 分割
console.log(arrayChunk(data, 3))
console.log(arrayChunk(data, 6))
  • 実行すると以下の2つが出力されます。
    • 要素数3つでの分割
    • 要素数を超えた値での分割(そのまま二次元化)
[["a", "b", "c"], ["d", "e"]]

[["a", "b", "c", "d", "e"]]

内容

  • 上記ではまず配列の型指定にジェネリクスを利用しています。
  • 分割等の汎用的な処理は、特定の型限定ではなく任意の型を利用側が決められる必要があるからです。
  • TypeScriptのジェネリクスでは慣習で「T」を利用するので、「対象」と「戻り値」それぞれに指定します。
  • あとは分割数分ループを回して、sliceで範囲指定して生成した配列を逐次pushするだけです。
    • ※高階関数(mapやreduce)を利用する方法もありましたが、速度や簡易化の観点からforでの実装にしました。
  • 以上です。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。