標題の通り。javascriptで、Array.prototype.mapは便利ですが、ちょっと機能不足だと思うことがあります。
1. 途中で終了したい
for文のbreakのように途中で終わりにしたい
2. スキップしたい
Array.prototype.filterのように、特定の要素をスキップしたい
forEachと途中終了の組み合わせなら、some / everyが応用できますが、map + 途中終了はできません。mapの後、filterを行うコード、個人的には良く書くのですが、ちょっと気持ち悪いと思うことがあります。しかも、途中終了はできません。
じゃぁ、こういう機能を持った新しいmapを定義したらいいんじゃないか?・・・と思うかもしれません。
いや、それはやめましょう。標準の文法だけで、直感的な書き方ができるからです。
const filter = (x) => x > 8 ? false : x / 2;
const array = [6,4,2,8,2,10,2,3];
Array.from((function* generator(){
for(const item of array) {
const filteredItem = filter(item)
if(filteredItem === false) {
break;// 終了する
} else if (filteredItem) {
yield filteredItem; // 出力する
} else {
// スキップする
}
}
})());
// [3, 2, 1, 4, 1]
こんな感じ。Array.fromにジェネレータを実行した結果を渡してあげれば良いだけです。自前で、mapを拡張するより、ずっと可読性が高いですね。ちなみに、ジェネレータそのものを渡してもダメなので気をつけましょう。