はじめに
普段JSやTSで新しい配列要素を作成したい時にmap
をよく利用します。
for~of
で回しながら先に用意している配列にpush
していく書き方よりも、配列を加工したい旨を明示でき、すっきり表現できると考えています。
何がしたいのか
全ての配列に対して加工する場合は問題ないですが、一部の値のみを対象に加工した配列を返却したい場面でmap
は少し面倒な動作をします。
<仕様>
- 管理者のユーザー名を「さん」をつけて収集したい
例)for~ofを利用した例
const users = [ { name: 'sample1', age: 30, admin: true }, { name: 'sample2', age: 20, admin: false}, ]; let target = []; for (const user of users) { if (!user.admin) continue; target.push(user.name + 'さん'); }
例)mapを利用した例
const users = [ { name: 'sample1', age: 30, admin: true }, { name: 'sample2', age: 20, admin: false}, ]; const target = users.map(user => { // ここでcontinueしてスキップしたい、、、 if (user.admin) { return user.name + 'さん'; } }) → ['sample1さん', undefined]
※mapについては下記リンクを参照 developer.mozilla.org
仕様を実現しようとすると、管理者でないデータがundefined
で返却されてしまいます。
その為、map
内でcontinue
を利用したいとなるのですが、ご存知の通りmap
内でcontinue
を利用する事はできません。そこで少し工夫をして同様の動作をできるようにしてみたいと思います。
解決方法
filter
関数を利用する事でundefined
が返却される問題に対応する事が可能になります。
const target = users .filter(user => user.admin) .map(user => user.name + 'さん'); → ['sample1さん']
上記コードではfilter
で管理者ユーザーのみ収集し、その後map
に収集したデータが渡されるので問題となっていたsample2
ユーザーの判定時にundefined
が返却されるを解消できます。