4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Javascriptのmapで、ちょっと機能不足な時

Last updated at Posted at 2018-05-07

標題の通り。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を拡張するより、ずっと可読性が高いですね。ちなみに、ジェネレータそのものを渡してもダメなので気をつけましょう。

4
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?