ESLint の no-useless-return とアタシの forEach への誤解

なんとなく javascript ってループ書きにくいなぁと思ってたが、知れば知るほど「あーオレってアホ」コレクションの追加祭り、の巻。

結果論的に「ESLint しはじめて良かった」てことだが、「だったらその前にもっと学習しとけ」とも思ったりもする。ともあれ。

ESLint なのだが、凄まじい数のルール数あるので、ひとまずは「上から順に、さらっとドキュメントを見て共感できそうかもなぁ」と思ったものを「とりあえずかけてみる」という段階なのだが、「共感できそう」にも種類があって、「これは無条件に従えるわ」とすぐにわかるものもあるし、「これはバカ相手だと危険だわ」とすぐにわかるものもあるし、「うーん、やってみないとなんともいえんかなぁ」てのもある。

no-useless-return については「やってみんとわからんわ」だったヤツ。これは簡単にはたとえば:

 1 function NG_of_this_rule() {
 2   if (condition) {
 3     return true;
 4   } else {
 5     return false;
 6   }
 7 }
 8 //
 9 function OK_of_this_rule() {
10   if (condition) {
11     return true;
12   }
13   return false;
14 }

みたいなこと。それこそカバレッジテストとの相性だったり、あるいは「全分岐を足せば全集合ルール」つまり:

1 if (20%) {
2 } else if (40%) {  // 計60%
3 } else if (30%) {  // 計90%
4 } else { // 残10%
5 }

こういう「集合論目線」の考え方もある(テストしやすかったりはする)ので、「無駄っしょそれ」に無条件に賛同出来るかといえば、そうでもない。けど「無頓着にやるよりはルールがあったほうが統一感持てていいかいね」くらいのノリで、「まぁやってみるか」とチェックさせてた。

なので以下が NG になる:

1         Object.keys(imported["a"]).forEach(function(e) {
2             // when all characters were expanded.
3             var all_expanded = true;
4             imported["a"][e]["chs"].forEach(function(ch) {
5                 if (!(ch["c"]["#"] in imported["c"])) {
6                     all_expanded = false;
7                     return;
8                 }
9             });

えーっと…、この return なくせる言うてるんだけど、「breakもどき」のつもりで return してたんぞ、なれば、return 取ったら意図と違うぜ、どうせいちゅぅの、と「思ってしまった」というオハナシ。

そもそも「何みて return が break の代わりになる」と思ったんだ? 今さっと調べなおしてみてもそんなガセ、見つからない。今軽く node.js で対話的に試してみたが、当然「break もどき」の振る舞いなんかしてない。あまりのアタシの雑さには呆れてしまった。

この場合いくつか選択肢があるが、ワタシのケースなら素直に findIndex であろう:

1         Object.keys(imported["a"]).forEach(function(e) {
2             // when all characters were expanded.
3             var all_expanded = imported["a"][e]["chs"].findIndex(function(ch) {
4                 return !(ch["c"]["#"] in imported["c"]);
5             }) < 0;

そして、今みてる StackOverflow でも言及されている通り、some も場合によっては使えるだろう。

「こういうアホをチェック出来る」ことは no-useless-return 著者の真意ではないだろうが、期せずしてそうなった。ありがとう…ありがとう…ありがとう…