背景
バイト中に、mongodbからとってきたオブジェクトの配列から、valueが重複しているものを除きたいという場面がありました。僕がmapとfilterでゴリゴリやっていたのを見たCTOが「(少なくともこのシーンでは)こっちの方がいいっすね」というふうにいってMapを使ってやる方法を教えてくれたのでメモ書き程度に書いています。
僕の書いたやつ
interface Item {
id: number
}
const data: Item[] = [
{ id: 1 },
{ id: 2 },
{ id: 1 }
]
const newData = data.filter((item, index, self) => (
index === self.findIndex(i => (
i._id === item._id
))
))
多分割と無難なんじゃないかなと思います。
教えてもらった実装
interface Item {
id: number
}
const data: Item[] = [
{ id: 1 },
{ id: 2 },
{ id: 1 }
]
const uniqueItems = data.reduce((map, item) => {
if (!map.has(item.id)) {
map.set(item.id, item)
}
return map
}, new Map<number, Item>())
const newData = Array.from(uniqueItems.values())
感想
僕は、「ある配列をもとになんらかの配列を生成する」という処理を考えるときに、どうしてもmapやfilterのみで考えてしまう傾向があるみたいなので、適宜他の方法も考えられるようにならないといけないなぁという感じですね。もちろん、mapやfilterなどの方が適している場合もあるので、そのへんうまく使い分けられるようになれたらいいっすね。