7件以降は出力しないで、forEachから抜けたいと思っています。
どのように記述するのがベストプラクティスなのか
まず、forEachはToDoリストのようなものだと考えてください。
どういう意味なのかと言うと「全部やれ」ってことです。
仮にあなたが上司として、部下にこの順番で与えた仕事をしてくれと指示したとしましょう。
その部下が自分勝手な考えでToDoリストの6件目までこなして、
7件以降を捨て始めたら「おいおい」ってなりますよね?
それと同じ事を言ってるわけです。
じゃあどういうアプローチが適切なのか?
それはforEachに入る前に配列の要素を6個に加工してやることです。
候補は色々あります
今回の頭から6件だけ取得するやり方としてスマートなのは前者のsliceですね
下のサンプルコードでは仮に.
や..
のファイル名が取得できた想定でfilterを使って除外、
そこからsliceで先頭6件を取得するというコードにしました。
js
1fs.readdir("./", (err, files) => {
2 files
3 .filter(file => file !== "." && file !== "..")
4 .slice(0, 6)
5 .forEach((file, index) => console.log(`${file} : ${index}`));
6});
7console.log("おわり");
おまけ: 途中まで処理しないとbreakできるか出来ないのかわからないケースが困る
ネイティブJSで全く道具が足りてない中、頑張ってリスト操作をやろうとするのがそもそもの過ちですね。
LodashやRamda.jsみたいなライブラリの力を借りるべきです。
Lodash: partitionの前半部だけ取り出して使うとかやればbreak的な事も実現出来ます。
ネイティブJSでやるならば
共通部分までmapで加工、
findIndexで添字を引き出して
sliceで切り取るというアプローチになるでしょうか。
reduceでステートを管理するようなアプローチもあるけど微妙。
js
1fs.readdir("./", (err, files) => {
2 files
3 .reduce((obj, it) => {
4 // for文の1行目でcontinueする作戦と同じ事をやることでbreak風の処理を実現
5 if (!obj.state) return obj;
6 obj.result.push(it);
7 // ある程度の処理が終わったら改めて継続条件の設定を行う
8 if (obj.result.length >= 6) obj.state = false;
9 return obj;
10 }, {result: [], state: true})
11 .result
12 .forEach(it => console.log(it));
13});
そもそも速度を考慮するのであれば、
mapやforEachを使わずfor...ofを使いましょう。
ネイティブJSはPromiseの逐次処理もfor...ofがないとお話にならないので、結局for文からは逃げられません。
ライブラリもfor文使うのも嫌なら、ClojureScriptやElmみたいな別言語に移住するべきでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/01 07:50