なんとなく 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 著者の真意ではないだろうが、期せずしてそうなった。ありがとう…ありがとう…ありがとう…