JavaScript 配列操作 ループ処理
やりたいこと
ひとことで言うと
配列のループ処理
複数行で言うと
以下のような配列の各要素に対して、ループ処理を行いたい
const results = [10, 20, 30]
例えばそれぞれ+5して標準出力へ表示すると以下のイメージの処理を繰り返すことになる。
console.log( result + 5 )
たくさんあるループの仕方
以下に5つのループの仕方を挙げますが、これ以外にもあります。たくさん知っていると品質が上がるかというと、根っこの部分まで理解している場合はその効果があるかも知れませんが、1つしか知らない人のプログラムの品質が低いかというとそうは思えないので、ご自分で試されてしっくりくればそれで良いのかなと。
for
const results = [10, 20, 30] for (let i = 0; i < results.length; i++) { console.log(results[i]) }
いにしえ?より伝わりし方式ですね。JavaとかC言語とかでもあり得る構図ですね。 ただ、実際に使うことはあまりなさそうです。というのも、実際に使う時にはresultsがundefinedな状況もあり得て、その場合lengthが無いって怒られちゃうので、ループの手前でチェックする必要があります。
for ..in
const results = [10, 20, 30] for (const x in results) { console.log(results[x]) }
indexとして0,1,2とxに値が入ってループが回るので、最初だけ特別な処理を挟むとか 偶数回、奇数回で処理を分けるとかそういうときにも使えます。
使い勝手的には、1つめに挙げたいにしえの方式と同じですが、resultsの中身がundefinedでもエラーになりません。「無いんだからループ回しません」って動きになるので人が作業するときの思考に違い感じですね。
ただし、弱点が無いわけではありません。この辺はなんちゃってプログラマーからみてJavaScriptの闇の部分ですね。この記事の最後に補足として書き記しておきます。
for …of
const results = [10, 20, 30] for (const result of results) { console.log(result) }
for …inと逆に?値の方を直にとれるやり方です。こっちには補足に記載の内容の心配はありません。
forEach その1
const results = [10, 20, 30] results.forEach(function(result, x) { console.log(result) })
即時関数は見た目に美しくないと思っているので、私は極力この書き方はしません。
forEach その2
results.forEach(result => { console.log(result) })
こちらの方(アロー関数式)の方がすっきりしますね。
補足
JavaScriptさんって変態というかなんというか...
for ...inでは、以下のコードで余計な部分まで?ループが回ります。
const results = [10, 20, 30] results.zzz = "zzz" for (const x in results) { console.log(results[x]) }
この結果が以下のようになります。
10 20 30 zzz
同じことがプロトタイプ拡張を行っても起こります。困ったものです。inとofの動作を同じレベルにして、今のinの動きをするin_xとof_x(命名適当)を用意してくれて良い気がするのですが...
そんなことを言っていると、おまえはinの意味が分かってないとか、ofとはね、みたいなことで怒られちゃう気がしますが。
ともかく残念ですが、for ...inには気をつけるしかなさそうです。
私の持論
私の持論としては、こういった凸凹というか下から積み上げていった結果としてのしわ寄せというか、「実はこういう動きなんだよねー」という感じの小ネタやTipsがちりばめられている技術やソフトウェアの方が世にはびこりますよね。
コンピュータを設計したのは人間なのに、その上に積み上げたものに使われるなんて私はまっぴらごめんですが、意外とこき使われていることに気がつかず、その方が心地よい人が多いようです。家政婦がこの自治体のゴミ出しの裏技知ってます自慢してるみたいで私はとてもイヤです。(段ボールは資源ゴミなので燃えるゴミでは出せません。でも30㎠以下に切り刻めば紙くずとして認められ燃えるゴミで捨てられます)
すべて人が創造した世界なんだから、ゴミはゴミ箱に入れたら分別すら不要、大きさだって四次元ポケット並みに伸縮自在に、そういうのであって欲しいです。そしてもっと言うなら、私は使用人ではなく、雇用主側の振る舞いをしたいです。自分たちで作った世界で使用人に甘んじるなんて、ほぼほぼ変態ですよね。
ただ残念なことに、今後もその意味で訳わかんないことと付き合っていないといけないですね。