【Javascript初心者】letを使いたくないならreduceを覚えろ
はじめに
Typescriptを初めて学習した時に、
基本的にconst
を使うようにと言われ、それに従ってコードを書いていると、
「あれ、let
なんか使わなくてもコード書けるじゃん」
「let
なんか一生使うことないわ〜」
と調子に乗っていた時期が自分にはありました笑
しかしある日、
・ 配列の合計値を求めるコードを実装しろ
「え、これ1ループごとに配列の値を合算して更新していくにはlet
を使うしか無理くね、、?」
このようにして、初学者の自尊心は粉々に砕け散ることになったのでした。。
対象読者
- このような経験をし、自尊心が粉々に砕け散った方
-
let
をなるべく使わずに、保守性の高いコードを書きたい方 -
reduce
を勉強したい方
結論
今までlet
を使っていたプログラミングコードが、、、
const numbers = [1, 2, 3, 4, 5]
let result = 0 // ← let!!!!!
for (let i = 0; i < numbers.length; i++) {
result += numbers[i]
}
reduce
を使うことでこのように大変身
const numbers = [1, 2, 3, 4, 5]
const result = numbers.reduce((acc, num) => {
return acc + num
}, 0)
reduce
について解説
なぜreduce
を使うとこのようなことができるのか、以下で詳しく見ていきましょう
map
やforEach
と基本的には同じ
reduce
は配列の各要素を1つずつ取り出して処理を行うという点で、map
やforEach
と同じです。
const numbers = [1, 2, 3, 4, 5]
const result = numbers.map((num) => num * 2)
const numbers = [1, 2, 3, 4, 5]
const result = numbers.forEach((num) => {
console.log(num * 2)
})
const numbers = [1, 2, 3, 4, 5]
const result = numbers.reduce((acc, num) => {
return acc + num
}, 0)
いずれのコードも、配列numbers
から各要素num
を取り出して、処理を行っています
これを見ると、コード内のacc
が何かわかればreduce
がわかりそうな気がしてきたと思います
(それに伴い自尊心も徐々に回復してきたと思います)
acc
って何??
acc
は、前のループで計算した値を保持し、次のループで使用するための変数です
下のようなイメージになります
これにより、配列の各要素を足し合わせることができます
acc
の初期値は?
acc
は、前のループで計算した値を保持し、
と先ほど書きましたが、最初のループでは前の値は存在しません
そのため、最初のループのacc
の値は、reduce
の第二引数で指定します
今回のコードでは、配列の各要素以外何も足し合わせる必要がないので0
を指定しています
まとめ
これからはreduce
を使いこなして自分の自尊心を取り戻していきましょう
(わかりづらい記事になっていたらすいません。わかりづらい部分があれば、ぜひコメントください)
Discussion