回答編集履歴

1

おまけ追加

2022/08/01 14:34

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -31,3 +31,39 @@
31
31
  });
32
32
  console.log("おわり");
33
33
  ```
34
+
35
+ ---
36
+
37
+ おまけ: 途中まで処理しないとbreakできるか出来ないのかわからないケースが困る
38
+
39
+ ネイティブJSで全く道具が足りてない中、頑張ってリスト操作をやろうとするのがそもそもの過ちですね。
40
+ LodashやRamda.jsみたいなライブラリの力を借りるべきです。
41
+ [Lodash: partition](https://lodash.com/docs/4.17.15#partition)の前半部だけ取り出して使うとかやればbreak的な事も実現出来ます。
42
+
43
+ ネイティブJSでやるならば
44
+ 共通部分まで[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)で加工、
45
+ [findIndex](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)で添字を引き出して
46
+ sliceで切り取るというアプローチになるでしょうか。
47
+
48
+ reduceでステートを管理するようなアプローチもあるけど微妙。
49
+
50
+ ```js
51
+ fs.readdir("./", (err, files) => {
52
+ files
53
+ .reduce((obj, it) => {
54
+ // for文の1行目でcontinueする作戦と同じ事をやることでbreak風の処理を実現
55
+ if (!obj.state) return obj;
56
+ obj.result.push(it);
57
+ // ある程度の処理が終わったら改めて継続条件の設定を行う
58
+ if (obj.result.length >= 6) obj.state = false;
59
+ return obj;
60
+ }, {result: [], state: true})
61
+ .result
62
+ .forEach(it => console.log(it));
63
+ });
64
+ ```
65
+
66
+ そもそも速度を考慮するのであれば、
67
+ mapやforEachを使わず[for...of](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of)を使いましょう。
68
+ ネイティブJSはPromiseの逐次処理もfor...ofがないとお話にならないので、結局for文からは逃げられません。
69
+ ライブラリもfor文使うのも嫌なら、ClojureScriptやElmみたいな別言語に移住するべきでしょう。