Skip to content

map reduce

map

ts
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

const doubledNumbers = numbers.map((n) => n * 2)

// [
//   2,  4,  6,  8, 10,
//  12, 14, 16, 18, 20
// ]
console.log(doubledNumbers)

reduce

 合計を求める。

ts
// reduce を使って配列の合計を求める
// reduce の構文: array.reduce((accumulator, currentValue) => {...}, initialValue)
//
// - accumulator (acc): 計算途中の値(累積値)
// - currentValue (n): 今処理している要素
// - initialValue: 最初の acc に入る値(ここでは 0)
//
// 流れ(numbers = [1,2,...,10] の場合)
//   acc=0, n=1 → 0+1=1
//   acc=1, n=2 → 1+2=3
//   acc=3, n=3 → 3+3=6
//   ...
//   acc=45, n=10 → 45+10=55
//
// 最終的に total = 55 になる
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const total = numbers.reduce((acc, n) => acc + n, 0)

// 55
console.log(total)

 最大値を求める。

ts
const numbers = [3, 7, 2, 9, 4]

// reduce を使って「最大値」を求める
// reduce の構文: array.reduce((acc, currentValue) => {...}, initialValue)
//
// - acc: これまでの計算結果(ここでは「現在の最大値」)
// - n  : 今処理している要素
// - initialValue: acc の初期値(ここでは 0)
//
// 流れ(numbers = [3,7,2,9,4] の場合)
//   acc=0, n=3 → 3 > 0 → acc=3
//   acc=3, n=7 → 7 > 3 → acc=7
//   acc=7, n=2 → 2 > 7 → acc=7
//   acc=7, n=9 → 9 > 7 → acc=9
//   acc=9, n=4 → 4 > 9 → acc=9
//
// 最終的に max = 9 になる
const max = numbers.reduce((acc, n) => (n > acc ? n : acc), 0)

// 9
console.log(max)

 最小値を求める。

ts
const numbers = [3, 7, 2, 9, 4]

// reduce を使って「最小値」を求める
// reduce の構文: array.reduce((acc, currentValue) => {...}, initialValue)
//
// - acc: これまでの計算結果(ここでは「現在の最小値」)
// - n  : 今処理している要素
// - initialValue: acc の初期値(ここでは配列の最初の要素 numbers[0])
//
// 流れ(numbers = [3,7,2,9,4] の場合)
//   acc=3, n=7 → 7 < 3 ? → false → acc=3
//   acc=3, n=2 → 2 < 3 ? → true  → acc=2
//   acc=2, n=9 → 9 < 2 ? → false → acc=2
//   acc=2, n=4 → 4 < 2 ? → false → acc=2
//
// 最終的に min = 2 になる
const min = numbers.reduce((acc, n) => (n < acc ? n : acc), numbers[0])

// 2
console.log(min)

 出現回数を求める。

ts
const fruits = ['apple', 'banana', 'apple', 'orange', 'banana']

// reduce を使って { fruit名: 出現回数 } のオブジェクトに変換する
// reduce の構文: array.reduce((acc, currentValue) => {...}, initialValue)
//
// - acc   : これまでの結果をためる「累積オブジェクト」
// - fruit : 今処理している要素(配列のフルーツ名)
// - initialValue: {} (最初は空のオブジェクトから始める)
//
// 処理の流れ
//   1回目: acc={}, fruit='apple'
//           acc['apple'] = (undefined || 0) + 1 = 1 → { apple: 1 }
//
//   2回目: acc={ apple:1 }, fruit='banana'
//           acc['banana'] = (undefined || 0) + 1 = 1 → { apple:1, banana:1 }
//
//   3回目: acc={ apple:1, banana:1 }, fruit='apple'
//           acc['apple'] = (1) + 1 = 2 → { apple:2, banana:1 }
//
//   4回目: acc={ apple:2, banana:1 }, fruit='orange'
//           acc['orange'] = (undefined || 0) + 1 = 1
//           → { apple:2, banana:1, orange:1 }
//
//   5回目: acc={ apple:2, banana:1, orange:1 }, fruit='banana'
//           acc['banana'] = (1) + 1 = 2
//           → { apple:2, banana:2, orange:1 }
//
// 最終的に counts = { apple:2, banana:2, orange:1 }
const counts = fruits.reduce<Record<string, number>>((acc, fruit) => {
  acc[fruit] = (acc[fruit] || 0) + 1
  return acc
}, {})

// { apple: 2, banana: 2, orange: 1 }
console.log(counts)