Language/JavaScript

[JavaScript] λ°°μ—΄ λ©”μ„œλ“œ(map, filter, reduce)

μ„€λΉˆ 2024. 10. 13. 10:24
λ°˜μ‘ν˜•

πŸ“š λ°°μ—΄ λ©”μ„œλ“œ(map, filter, reduce)λž€ λ¬΄μ—‡μΈκ°€μš”?

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 배열을 λ‹€λ£¨λŠ” 것은 맀우 μ€‘μš”ν•΄μš”. 특히 map, filter, reduce 같은 λ°°μ—΄ λ©”μ„œλ“œλŠ” 배열을 κ°„νŽΈν•˜κ³  효과적으둜 μ²˜λ¦¬ν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•΄μš”. 이 μ„Έ 가지 λ©”μ„œλ“œλŠ” 각각 배열을 λ³€ν™˜, 필터링, μΆ•μ†Œν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•΄μš”.

 

λΉ„μœ ν•˜μžλ©΄, map은 μ›λž˜μ˜ λ°°μ—΄μ—μ„œ 무언가λ₯Ό λ³€ν˜•ν•΄μ„œ μƒˆλ‘œμš΄ 배열을 λ§Œλ“œλŠ” μž‘μ—…μ΄κ³ , filterλŠ” μ›ν•˜λŠ” 쑰건에 λ§žλŠ” μš”μ†Œλ§Œ κ±ΈλŸ¬λ‚΄λŠ” μž‘μ—…, 그리고 reduceλŠ” 배열을 ν•œ λ©μ–΄λ¦¬λ‘œ μΆ•μ†Œν•˜μ—¬ 단일 κ°’μœΌλ‘œ λ§Œλ“œλŠ” μž‘μ—…μ΄μ—μš”.


πŸ–₯️ λ°°μ—΄ λ©”μ„œλ“œ(map, filter, reduce)의 κ°œλ…κ³Ό μ˜ˆμ‹œ

1. map: 배열을 λ³€ν˜•ν•˜λŠ” λ©”μ„œλ“œ

  • map λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ 각 μš”μ†Œμ— λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ—¬, μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•΄μš”. κΈ°μ‘΄ 배열을 λ³€κ²½ν•˜μ§€ μ•Šκ³ , μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜μ£ .
  • 예λ₯Ό λ“€μ–΄, λ°°μ—΄μ˜ λͺ¨λ“  숫자λ₯Ό 2배둜 λ§Œλ“€κ±°λ‚˜, λ¬Έμžμ—΄μ„ λŒ€λ¬Έμžλ‘œ λ°”κΎΈλŠ” μž‘μ—…μ„ ν•  λ•Œ μœ μš©ν•΄μš”.
// λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό 2배둜 λ§Œλ“€κΈ°
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num => num * 2);

console.log("μ›λž˜ λ°°μ—΄:", numbers); // [1, 2, 3, 4, 5]
console.log("2배둜 λ³€ν™˜λœ λ°°μ—΄:", doubled); // [2, 4, 6, 8, 10]

map λ©”μ„œλ“œλŠ” numμ΄λΌλŠ” 인자λ₯Ό λ°›μ•„ κ·Έ 값을 2배둜 λ§Œλ“  ν›„, μƒˆλ‘œμš΄ λ°°μ—΄ doubled에 κ·Έ κ²°κ³Όλ₯Ό λ‹΄μ•„μš”.
μ›λž˜ 배열인 numbersλŠ” λ³€ν•˜μ§€ μ•Šκ³ , μƒˆλ‘œμš΄ 배열이 λ°˜ν™˜λœλ‹€λŠ” 점이 μ€‘μš”ν•΄μš”.

2. filter: 쑰건에 λ§žλŠ” μš”μ†Œλ§Œ μΆ”μΆœν•˜λŠ” λ©”μ„œλ“œ

  • filter λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ μš”μ†Œ μ€‘μ—μ„œ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ“€λ§Œ κ±ΈλŸ¬λ‚΄μ–΄ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•΄μš”.
  • 예λ₯Ό λ“€μ–΄, λ°°μ—΄μ—μ„œ 짝수만 μΆ”μΆœν•˜κ±°λ‚˜, νŠΉμ • 기쀀을 μΆ©μ‘±ν•˜λŠ” μš”μ†Œλ“€λ§Œ 남기고 싢을 λ•Œ μ‚¬μš©ν•΄μš”.
// λ°°μ—΄μ—μ„œ 짝수만 μΆ”μΆœν•˜κΈ°
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(num => num % 2 === 0);

console.log("μ›λž˜ λ°°μ—΄:", numbers); // [1, 2, 3, 4, 5]
console.log("짝수만 μΆ”μΆœλœ λ°°μ—΄:", evenNumbers); // [2, 4]

filter λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ 각 μš”μ†Œκ°€ μ§μˆ˜μΈμ§€ ν™•μΈν•˜κ³ , κ·Έ 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ“€λ§Œ μƒˆλ‘œμš΄ λ°°μ—΄ evenNumbers에 λ‹΄μ•„μš”.
μ›λž˜ λ°°μ—΄ numbersλŠ” λ³€ν•˜μ§€ μ•Šμ•„μš”.

3. reduce: 배열을 μΆ•μ†Œν•˜λŠ” λ©”μ„œλ“œ

  • reduce λ©”μ„œλ“œλŠ” 배열을 μˆœνšŒν•˜λ©°, 각 μš”μ†Œλ₯Ό λˆ„μ ν•˜μ—¬ 단일 κ°’μœΌλ‘œ μΆ•μ†Œν•΄μš”. λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μ€„μ΄λŠ” 데 μ‚¬μš©λ˜λ©°, 합계, 평균, μ΅œλŒ€κ°’ 등을 ꡬ할 λ•Œ 많이 μ‚¬μš©ν•΄μš”.
  • reduceλŠ” 두 개의 인자λ₯Ό λ°›λŠ”λ°, 첫 λ²ˆμ§ΈλŠ” λˆ„μ  κ°’(accumulator), 두 λ²ˆμ§ΈλŠ” ν˜„μž¬ 처리 쀑인 μš”μ†Œ(current value)μ˜ˆμš”.
// λ°°μ—΄μ˜ 합계 κ΅¬ν•˜κΈ°
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);

console.log("μ›λž˜ λ°°μ—΄:", numbers); // [1, 2, 3, 4, 5]
console.log("λ°°μ—΄μ˜ 합계:", sum); // 15

reduce λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ 첫 번째 μš”μ†ŒλΆ€ν„° λ§ˆμ§€λ§‰ μš”μ†ŒκΉŒμ§€ 순차적으둜 λ”ν•΄μ„œ sumμ΄λΌλŠ” λ³€μˆ˜μ— 합계λ₯Ό μ €μž₯ν•΄μš”.
μ›λž˜ λ°°μ—΄ numbersλŠ” λ³€ν•˜μ§€ μ•Šκ³ , κ²°κ³ΌλŠ” 단일 κ°’μœΌλ‘œ μΆ•μ†ŒλΌμš”.


πŸ€” λ°°μ—΄ λ©”μ„œλ“œ(map, filter, reduce)의 ν™œμš© 예

λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹€μš©μ μΈ 데이터 처리 μž‘μ—…μ„ 맀우 κ°„κ²°ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμ–΄μš”. μ‚¬μš©μž λͺ©λ‘κ³Ό 같은 μ‹€μ œ 데이터λ₯Ό μ‚¬μš©ν•΄ map, filter, reduce λ©”μ„œλ“œκ°€ 각각 μ–΄λ–»κ²Œ ν™œμš©λ  수 μžˆλŠ”μ§€ μ‚΄νŽ΄λ³Όκ²Œμš”.

1. map: λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό λ³€ν˜•ν•˜λŠ” λ©”μ„œλ“œ

map λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ 각 μš”μ†Œμ— λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•΄μš”. 주둜, λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό λ³€ν™˜ν•˜λŠ” 데 μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

  • map λ©”μ„œλ“œλ₯Ό 톡해 λ°°μ—΄μ˜ 크기λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μš”μ†Œμ˜ λ‚΄μš©λ§Œ λ³€κ²½ν•  수 μžˆμ–΄μš”.
  • ν˜„μ‹€μ μΈ 데이터 ꡬ쑰(μ‚¬μš©μž λͺ©λ‘ λ“±)에 μ μš©ν•˜μ—¬, λ°°μ—΄μ˜ 각 κ°μ²΄μ—μ„œ νŠΉμ • μ†μ„±λ§Œμ„ κ°„νŽΈν•˜κ²Œ μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예제: μ‚¬μš©μž μ΄λ¦„λ§Œ μΆ”μΆœν•˜κΈ°

const users = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 35 },
];

// μ‚¬μš©μž λͺ©λ‘μ—μ„œ μ΄λ¦„λ§Œ μΆ”μΆœ
const userNames = users.map(user => user.name);

console.log(userNames); // ["Alice", "Bob", "Charlie"]

이 μ˜ˆμ œμ—μ„œλŠ” map λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ μ‚¬μš©μž λͺ©λ‘μ—μ„œ μ΄λ¦„λ§Œ μΆ”μΆœν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 λ§Œλ“€μ—ˆμ–΄μš”.
map은 각 μš”μ†Œμ—μ„œ μ΄λ¦„λ§Œ λ°˜ν™˜ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό 배열에 λ‹΄μŠ΅λ‹ˆλ‹€.
μ›λž˜ 배열인 usersλŠ” λ³€ν•˜μ§€ μ•ŠμœΌλ©°, μƒˆλ‘œμš΄ λ°°μ—΄ userNamesκ°€ λ°˜ν™˜λΌμš”.

2. filter: 쑰건에 λ§žλŠ” μš”μ†Œλ§Œ μΆ”μΆœν•˜λŠ” λ©”μ„œλ“œ

filter λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ μš”μ†Œ μ€‘μ—μ„œ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ“€λ§Œ κ±ΈλŸ¬λ‚΄μ–΄ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•΄μš”.

  • filter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ›ν•˜λŠ” 쑰건에 λ§žλŠ” λ°μ΄ν„°λ§Œ κ°„νŽΈν•˜κ²Œ μΆ”μΆœν•  수 μžˆμ–΄μš”.
  • λ°°μ—΄μ˜ 크기가 쀄어듀며, 원본 배열은 λ³€ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ λ°°μ—΄λ§Œ λ°˜ν™˜λœλ‹€λŠ” 점을 κΈ°μ–΅ν•˜μ„Έμš”.

예제: λ‚˜μ΄κ°€ 30 이상인 μ‚¬μš©μžλ§Œ μΆ”μΆœν•˜κΈ°

const users = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 35 },
];

// λ‚˜μ΄κ°€ 30 이상인 μ‚¬μš©μžλ§Œ μΆ”μΆœ
const adults = users.filter(user => user.age >= 30);

console.log(adults); 
// [{ name: "Bob", age: 30 }, { name: "Charlie", age: 35 }]

이 μ˜ˆμ œμ—μ„œλŠ” filter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ λ‚˜μ΄κ°€ 30 이상인 μ‚¬μš©μžλ§Œ κ±ΈλŸ¬λƒˆμ–΄μš”.
쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ“€λ§Œ μƒˆλ‘œμš΄ 배열에 담겨 λ°˜ν™˜λ©λ‹ˆλ‹€. 쑰건에 λ§žμ§€ μ•ŠλŠ” μš”μ†ŒλŠ” μƒˆλ‘œμš΄ 배열에 ν¬ν•¨λ˜μ§€ μ•Šμ•„μš”.

3. reduce: 배열을 ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μΆ•μ†Œν•˜λŠ” λ©”μ„œλ“œ

reduce λ©”μ„œλ“œλŠ” λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό λˆ„μ ν•˜μ—¬ 단일 κ°’μœΌλ‘œ μΆ•μ†Œν•΄μš”. 주둜, λ°°μ—΄μ˜ ν•©κ³„λ‚˜ 평균을 ꡬ할 λ•Œ μ‚¬μš©λΌμš”.

  • reduce λ©”μ„œλ“œλŠ” λ°°μ—΄μ„ 단일 κ°’μœΌλ‘œ 쀄여야 ν•˜λŠ” μž‘μ—…μ— μ ν•©ν•΄μš”.
  • λ°°μ—΄μ˜ 합계, 평균, κ³±μ…ˆ, λ˜λŠ” λ‹€λ₯Έ λ³΅μž‘ν•œ 계산이 ν•„μš”ν•œ μƒν™©μ—μ„œ 자주 μ‚¬μš©λΌμš”.

예제: μ‚¬μš©μžμ˜ 총 λ‚˜μ΄ κ³„μ‚°ν•˜κΈ°

const users = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 35 },
];

// μ‚¬μš©μžμ˜ λ‚˜μ΄ 합계 계산
const totalAge = users.reduce((acc, user) => acc + user.age, 0);

console.log(totalAge); // 90

이 μ˜ˆμ œμ—μ„œλŠ” reduce λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ μ‚¬μš©μžλ“€μ˜ 총 λ‚˜μ΄λ₯Ό κ³„μ‚°ν–ˆμ–΄μš”.
acc(λˆ„μ  κ°’)λŠ” λ°°μ—΄μ˜ 각 μš”μ†Œμ˜ λ‚˜μ΄λ₯Ό λ”ν•˜λ©΄μ„œ κ³„μ†ν•΄μ„œ λˆ„μ λ©λ‹ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ 총 λ‚˜μ΄κ°€ λ°˜ν™˜λΌμš”. μ—¬κΈ°μ„œ 0은 λˆ„μ  κ³„μ‚°μ˜ μ΄ˆκΈ°κ°’μž…λ‹ˆλ‹€.


🚨 μ£Όμ˜ν•  점

λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  λͺ‡ 가지 사항이 μžˆμ–΄μš”.

  1. 원본 배열은 λ³€ν•˜μ§€ μ•Šμ•„μš”. map, filter, reduce λ©”μ„œλ“œλŠ” κΈ°μ‘΄ 배열을 λ³€κ²½ν•˜μ§€ μ•Šκ³ , μƒˆλ‘œμš΄ λ°°μ—΄ λ˜λŠ” 값을 λ°˜ν™˜ν•΄μš”. λ”°λΌμ„œ 원본 배열을 μ•ˆμ „ν•˜κ²Œ μœ μ§€ν•  수 μžˆμ–΄μš”.
  2. μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜λŠ” 것이 μ€‘μš”ν•΄μš”. 특히 reduce λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, 예기치 μ•Šμ€ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμ–΄μš”. μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•΄μ€˜μ•Ό λ°°μ—΄μ˜ 첫 번째 μš”μ†Œλ₯Ό μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆμ–΄μš”.
  3. ν•¨μˆ˜μ˜ λ™μž‘μ„ λͺ…ν™•ν•˜κ²Œ 이해해야 ν•΄μš”. map은 λ°°μ—΄μ˜ 크기가 λ³€ν•˜μ§€ μ•Šκ³ , filterλŠ” λ°°μ—΄μ˜ 크기가 쀄어듀 수 있으며, reduceλŠ” λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μΆ•μ†Œν•œλ‹€λŠ” 점을 κΈ°μ–΅ν•΄μ•Ό ν•΄μš”. 각각의 λ©”μ„œλ“œκ°€ 배열을 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•΄μš”.

πŸ“– κ²°λ‘ 

map, filter, reduceλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 배열을 μ²˜λ¦¬ν•˜λŠ” κ°•λ ₯ν•œ λ„κ΅¬μ˜ˆμš”. map은 λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό λ³€ν˜•ν•˜κ³ , filterλŠ” νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ§Œ μΆ”μΆœν•˜λ©°, reduceλŠ” 배열을 단일 κ°’μœΌλ‘œ μΆ•μ†Œν•΄μš”. 이 μ„Έ 가지 λ©”μ„œλ“œλ₯Ό κ²°ν•©ν•˜λ©΄ 맀우 κ°•λ ₯ν•œ λ°°μ—΄ 처리 λ‘œμ§μ„ κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμ–΄μš”.

 

특히, λ°°μ—΄ λ©”μ„œλ“œλŠ” κ°„κ²°ν•œ μ½”λ“œ μž‘μ„±κ³Ό λͺ…ν™•ν•œ μ˜λ„ ν‘œν˜„μ— 도움을 μ£ΌκΈ° λ•Œλ¬Έμ—, 배열을 λ‹€λ£° λ•ŒλŠ” 이 λ©”μ„œλ“œλ“€μ„ 적극 ν™œμš©ν•˜λŠ” 것이 μ’‹μ•„μš”.


πŸ”— μΆ”κ°€ 정보

  • μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄ λ©”μ„œλ“œμ— λŒ€ν•œ 더 κΉŠμ€ 이해λ₯Ό μ›ν•˜μ‹ λ‹€λ©΄, MDN Web Docsμ—μ„œ μžμ„Έν•œ 정보λ₯Ό μ°Ύμ•„λ³Ό 수 μžˆμ–΄μš”.
λ°˜μ‘ν˜•