概要
業務内でTypeScriptで配列からundefined
を除去する処理を書いていて、filter
とflatMap
を使う機会があり違いが気になったのでメモ。
filter
- 返り値:filterに渡すコールバック関数の結果が
true
である要素のみを要素とする新しい配列 - TypeScript上で
(number | undefined)[]
型の配列に対してundefined
を取り除くようなfilterをかけても、返り値は(number | undefined)[]
のため要素がundefined
である可能性を排除できない
const array = [1, 2, 3, undefined, 5]
const filteredArray = array.filter(number => number !== undefined)//undefinedを除去するfilterをかける
console.log(filteredArray[3].toString()) //Object is possibly 'undefined'とエラーがでる
flatMap
- 返り値各要素がコールバック関数の結果であり、深さが 1 にフラット化された新しい配列
-
map()→flat()
の順で処理をした場合と同じ結果になる(少しだけ楽に書ける)
const array = [1, 2, 3, undefined, 5]
const filteredArray = array.flatMap(number => number ?? []) //undefinedを除去する処理
//const filteredArray = array.map(number => number ?? []).flat()と同じ
//array.map(): number[][]、array.map().flat(): number[]となり、mapの戻り値が元の型に依存しないためundefinedを削除できる
console.log(filteredArray[3].toString()) //filteredArrayはnumber[]なので、エラーが出ない