[TypeScript]二次元配列を別の二次元配列の中身でフィルターする

2023.02.08

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

  • t_o_dと申します。
  • 二次元配列は表形式データを扱う上で便利なので利用する機会が多いです。
  • そこで今回はTypeScriptで指定の二次元配列を別の二次元配列の中身でフィルターする方法を記録いたします。

環境

  • mac OS Ventura 13.1
  • typescript 4.9.5

結果

  • 結果のコードは以下の通りです。
// 対象データ
const data = [
    ['a001','サッカー','高橋',],
    ['a002','野球','斉藤',],
    ['a003','テニス','鈴木',],
]

// 対象インデックス
const index = 1;

// 検索元
const targets = [ ['サッカー'], ['バスケ'], ['ゴルフ'] ]

// フィルター関数
const filterData = (data: string[][], targets: string[][], index: number): string[][] => {
    const searches = new Set(targets.flat());
    return data.filter(d => searches.has(d[index]));
}

// 出力
console.log(filterData(data, targets, index))
  • 実行すると以下のように「data」の2列目の値が「targets」の値とマッチした配列だけフィルタリングされて出力します。
[["a001", "サッカー", "高橋"]]

内容

  • 上記の「filterData」関数では検索元の二次元配列に以下の処理を行っています。
    • flatで一次元配列化
    • Setオブジェクトへの変換
  • 「targets」配列は検索値のみが入っているので、flatで一次元にすることで余分な階層処理が不要になり、filterの中でincludesするだけでよくなりました。
  • ただ数が増えてくるとincludes呼び出しも増えて速度の差が顕著に現れてきます。
  • そのため検索が早いデータ構造のSetへ変換して内部のhasメソッドを使うことで、より速く安定的に実行できるようにしています。
  • 以上です。

参考

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

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