【Typescript】letを使いたくないならreduceを覚えろ
はじめに
Typescriptを初めて学習した時に、
基本的にconst
を使うようにと言われ、それに従ってコードを書いていると、
「あれ、let
なんか使わなくてもコード書けるじゃん」
「let
なんか一生使うことないわ〜」
とイキっていた時期が自分にはありました (笑)
しかしある日、
・ 配列の合計値を求めるコードを実装しろ
「え、これ1ループごとに配列の値を合算して更新していくにはlet
を使うしか無理くね、、?」
このようにして、【Typescriptを完全に理解した】初学者の自尊心は粉々に砕け散ることになるのでした、、 (めでたしめでたし)
対象読者
- この記事では、そのような悲劇に苛まれた初学者の自尊心を少しでも取り戻すための記事になっています
- 該当する方はブラウザバックしたくなる自分の心の弱さと向き合いながら読了してみてください
結論
今まで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