[TypeScript]二次元配列をカラム毎に分割した連想配列に変換する方法

2022.10.25

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

  • t_o_dと申します。
  • 二次元配列は表形式データを扱う上で便利なので利用する機会が多いです。
  • ただ項目ごとに関連するデータをまとめたい場合は連想配列を利用したいです。
  • そこで今回はTypeScriptで二次元配列を列番号指定でカラム毎に分割した連想配列に変換する方法を記述します。

環境

  • mac OS Monterey 12.6
  • typescript 4.8.3

結果

  • 変換する対象は以下のようなstring型の二次元配列です。
const sample = [
    ['a001','サッカー','高橋',],
    ['a002','野球','斉藤',],
    ['a003','野球','高橋',],
    ['a004','テニス','斉藤',],
    ['a005','テニス','高橋',],
    ['a006','テニス','鈴木',],
]
  • 変換後の形式としては以下のような連想配列です。
{
  "高橋": [
    ["a001", "サッカー", "高橋"],
    ["a003", "野球", "高橋"],
    ["a005", "テニス", "高橋"]
  ],
  "斉藤": [
    ["a002", "野球", "斉藤"],
    ["a004", "テニス", "斉藤"]
  ],
  "鈴木": [
    ["a006", "テニス", "鈴木"]
  ]
}
  • 以下が「列番号指定でカラム毎に分割した連想配列に変換する」関数です。
export const divisionArrayOnColumn = (target: string[][], column: number) => {
    const result: {[key: string]: string[][]} = {}; 
    target.forEach(t => {
        if(t[column] in result){
            result[t[column]].push(t);
        } else {
            result[t[column]] = [t,];
        }   
    }); 
    return result;
}
  • 以下が使用例です。第一引数targetに対象配列を指定して、第二引数columnに列番号(インデックス)を指定します。
// 上記の変換関数
import { divisionArrayOnColumn } from './util.ts'

// 対象
const sample = [
    ['a001','サッカー','高橋',],
    ['a002','野球','斉藤',],
    ['a003','野球','高橋',],
    ['a004','テニス','斉藤',],
    ['a005','テニス','高橋',],
    ['a006','テニス','鈴木',],
]

// 結果
const result = divisionArrayOnColumn(sample, 2)
console.log(result)
  • 実行すると以下のように上記で示した形式の連想配列が表示されます。
{
  "高橋": [
    ["a001", "サッカー", "高橋"],
    ["a003", "野球", "高橋"],
    ["a005", "テニス", "高橋"]
  ],
  "斉藤": [
    ["a002", "野球", "斉藤"],
    ["a004", "テニス", "斉藤"]
  ],
  "鈴木": [
    ["a006", "テニス", "鈴木"]
  ]
}

参考

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

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