[TypeScript]二次元配列を別の二次元配列の中身でフィルターする
- 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サイトをご覧ください。