JavaScript

[JS] some()κ³Ό reduce()에 λŒ€ν•΄~

Irene1988 2025. 2. 27. 01:10

πŸ”Ή some() λ©”μ„œλ“œλž€?

πŸ“Œ λ°°μ—΄μ˜ μš”μ†Œ 쀑 ν•˜λ‚˜λΌλ„ 쑰건을 λ§Œμ‘±ν•˜λ©΄ true λ°˜ν™˜
πŸ“Œ λͺ¨λ“  μš”μ†Œκ°€ 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠμœΌλ©΄ false λ°˜ν™˜
πŸ“Œ filter()λ‚˜ map()보닀 λΉ λ₯΄κ²Œ 검사 κ°€λŠ₯ (ν•˜λ‚˜λ§Œ 찾으면 λ°”λ‘œ μ’…λ£Œλ¨)


βœ… some() κΈ°λ³Έ μ‚¬μš©λ²•

let numbers = [10, 20, 30, 40, 50];

let hasBigNumber = numbers.some(num => num > 30);
console.log(hasBigNumber); // true (40과 50이 있음)

let hasNegative = numbers.some(num => num < 0);
console.log(hasNegative); // false (μŒμˆ˜κ°€ μ—†μŒ)

 

βœ… some()을 μ‚¬μš©ν•œ μœ νš¨μ„± 검사

μ•„λž˜ μ½”λ“œμ—μ„œ some()을 μ‚¬μš©ν•΄ μž…λ ₯값이 100을 μ΄ˆκ³Όν•˜κ±°λ‚˜ 잘λͺ»λœ 값인지 ν™•μΈν–ˆμ–΄μš”.

let scores = [90, 105, 80]; 

if (scores.some(score => isNaN(score) || score < 0 || score > 100)) {
    console.log('❌ μ˜¬λ°”λ₯Έ 점수λ₯Ό μž…λ ₯ν•˜μ„Έμš”!');
} else {
    console.log('βœ… μž…λ ₯된 μ μˆ˜λŠ” μ •μƒμž…λ‹ˆλ‹€.');
}

 

πŸ” λ™μž‘ 방식

 

  • some()이 scores 배열을 λŒλ©΄μ„œ score > 100 λ˜λŠ” score < 0 λ˜λŠ” isNaN(score) 쑰건을 검사
  • 105κ°€ score > 100을 λ§Œμ‘±ν•˜λ―€λ‘œ μ¦‰μ‹œ true λ°˜ν™˜ ν›„ μ’…λ£Œ
  • "❌ μ˜¬λ°”λ₯Έ 점수λ₯Ό μž…λ ₯ν•˜μ„Έμš”!" 좜λ ₯

🎯 some() vs every() 차이

 

 

  • some() → ν•˜λ‚˜λΌλ„ 쑰건을 λ§Œμ‘±ν•˜λ©΄ true
  • every() → λͺ¨λ“  μš”μ†Œκ°€ 쑰건을 λ§Œμ‘±ν•΄μ•Ό true
let scores = [90, 80, 70];

console.log(scores.some(score => score > 100));  // false (100 초과 μ—†μŒ)
console.log(scores.every(score => score < 100)); // true (λͺ¨λ“  값이 100 미만)

 

 

πŸ”₯ some()을 써야 ν•˜λŠ” 경우

βœ… 배열에 νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œκ°€ μžˆλŠ”μ§€ λΉ λ₯΄κ²Œ 검사할 λ•Œ
βœ… λͺ¨λ“  μš”μ†Œλ₯Ό 검사할 ν•„μš” 없이 ν•˜λ‚˜λΌλ„ 발견되면 λ°”λ‘œ 멈좜 λ•Œ
βœ… μœ νš¨μ„± 검사(숫자 체크, λ²”μœ„ 체크, 쀑볡 체크) 등에 ν™œμš©ν•  λ•Œ

 


πŸ”Ή reduce()λž€?

πŸ“Œ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μ€„μ΄λŠ”(reduce) λ©”μ„œλ“œ
πŸ“Œ λˆ„μ (accumulator) κ°’κ³Ό ν˜„μž¬(current) 값을 μ΄μš©ν•˜μ—¬ μ—°μ‚°
πŸ“Œ 합계, 평균, μ΅œλŒ€κ°’, μ΅œμ†Œκ°’, 객체 λ³€ν™˜ λ“± λ‹€μ–‘ν•œ μž‘μ—… κ°€λŠ₯

 

βœ… reduce() κΈ°λ³Έ μ‚¬μš©λ²•

let numbers = [10, 20, 30, 40];

let sum = numbers.reduce((acc, cur) => acc + cur, 0);

console.log(sum); // 100

 

πŸ” λ™μž‘ 방식 (reduce() λ‚΄λΆ€ μ‹€ν–‰ κ³Όμ •)

Iteration acc (λˆ„μ κ°’) cur (ν˜„μž¬κ°’) μ—°μ‚° κ²°κ³Ό
μ΄ˆκΈ°κ°’ 0 10 0 + 10 = 10
1번째 10 20 10 + 20 = 30
2번째 30 30 30 + 30 = 60
3번째 60 40 60 + 40 = 100

πŸ“Œ reduce((acc, cur) => acc + cur, 0)

 

  • acc → λˆ„μ  κ°’ (이전 μ—°μ‚° κ²°κ³Ό)
  • cur → ν˜„μž¬ λ°°μ—΄ μš”μ†Œ
  • 0 → μ΄ˆκΈ°κ°’ (μƒλž΅ν•˜λ©΄ λ°°μ—΄μ˜ 첫 번째 μš”μ†Œκ°€ μ΄ˆκΈ°κ°’)

🎯 reduce()λ₯Ό ν™œμš©ν•œ λ‹€μ–‘ν•œ 예제

1️⃣ λ°°μ—΄ μš”μ†Œ ν•© κ΅¬ν•˜κΈ°

let numbers = [5, 10, 15];

let total = numbers.reduce((acc, cur) => acc + cur, 0);
console.log(total); // 30

2️⃣ λ°°μ—΄ μš”μ†Œ 평균 κ΅¬ν•˜κΈ°

let scores = [80, 90, 100];

let average = scores.reduce((acc, cur) => acc + cur, 0) / scores.length;
console.log(average); // 90

3️⃣ μ΅œλŒ€κ°’ & μ΅œμ†Œκ°’ κ΅¬ν•˜κΈ°

let numbers = [25, 78, 3, 99, 50];

let max = numbers.reduce((acc, cur) => (acc > cur ? acc : cur), numbers[0]);
console.log(max); // 99

let min = numbers.reduce((acc, cur) => (acc < cur ? acc : cur), numbers[0]);
console.log(min); // 3

4️⃣ λ°°μ—΄ μš”μ†Œ 개수 μ„ΈκΈ° (객체 λ³€ν™˜)

let fruits = ['🍎', '🍌', '🍎', 'πŸ‡', '🍎', '🍌'];

let count = fruits.reduce((acc, cur) => {
    acc[cur] = (acc[cur] || 0) + 1; // ν˜„μž¬ 과일 개수 카운트
    return acc;
}, {});

console.log(count); // { '🍎': 3, '🍌': 2, 'πŸ‡': 1 }

*** 이거 μ½”λ“œκ°€ μ–΄λ €μš°λ‹ˆ μ’€ 더... μƒμ„Ένžˆ ν’€μ–΄λ³΄μž!

1. 배열을 reduce()둜 μˆœνšŒν•˜λ©΄μ„œ 개수 μ €μž₯

let count = fruits.reduce((acc, cur) => { ... }, {});

 

  • acc → λˆ„μ  객체 (과일 개수λ₯Ό μ €μž₯ν•  객체)
  • cur → ν˜„μž¬ 순회 쀑인 과일 (🍎, 🍌, λ“±)
  • {} → μ΄ˆκΈ°κ°’μœΌλ‘œ 빈 객체 {} μ‚¬μš© (κ²°κ³Όλ₯Ό μ €μž₯ν•  곡간)

 

2. 각 과일 개수 μ„ΈκΈ°

acc[cur] = (acc[cur] || 0) + 1;

이 뢀뢄이 ν•΅μ‹¬μž…λ‹ˆλ‹€! πŸ’‘

  • acc[cur] → ν˜„μž¬ 과일(cur)의 개수λ₯Ό accμ—μ„œ κ°€μ Έμ˜΄
    • λ§Œμ•½ 첫 λ“±μž₯이라면 acc[cur]이 undefined
    • undefined || 0 → 0으둜 μ„€μ • (μ΄ˆκΈ°κ°’μ„ 0으둜 μ„€μ •)
  • (acc[cur] || 0) + 1 → κΈ°μ‘΄ κ°œμˆ˜μ—μ„œ +1 증가
  • acc[cur] = ... → μ¦κ°€λœ 개수λ₯Ό λ‹€μ‹œ 객체에 μ €μž₯

πŸ”Ž 예제둜 풀어보기

| cur κ°’ | κΈ°μ‘΄ acc[cur] κ°’ | (acc[cur] || 0) + 1 | μ΅œμ’… acc 객체 | |----------|-------------------|---------------------|------------------| | 🍎 | undefined (μ—†μŒ) | 0 + 1 = 1 | { '🍎': 1 } | | 🍌 | undefined (μ—†μŒ) | 0 + 1 = 1 | { '🍎': 1, '🍌': 1 } | | 🍎 | 1 (이미 있음) | 1 + 1 = 2 | { '🍎': 2, '🍌': 1 } | | πŸ‡ | undefined (μ—†μŒ) | 0 + 1 = 1 | { '🍎': 2, '🍌': 1, 'πŸ‡': 1 } | | 🍎 | 2 (이미 있음) | 2 + 1 = 3 | { '🍎': 3, '🍌': 1, 'πŸ‡': 1 } | | 🍌 | 1 (이미 있음) | 1 + 1 = 2 | { '🍎': 3, '🍌': 2, 'πŸ‡': 1 } |

 

3. κ²°κ³Ό 좜λ ₯

console.log(count); 
// { '🍎': 3, '🍌': 2, 'πŸ‡': 1 }

→ 각 과일이 λͺ‡ 번 λ‚˜μ™”λŠ”μ§€ 개수λ₯Ό μ„Έμ„œ 객체둜 λ³€ν™˜ μ™„λ£Œ! 🎯

✨ μ΅œμ’… 정리

βœ” reduce()λ₯Ό μ‚¬μš©ν•˜μ—¬ 배열을 객체둜 λ³€ν™˜
βœ” (acc[cur] || 0) + 1 을 μ‚¬μš©ν•΄ ν˜„μž¬ 값이 μ—†μœΌλ©΄ 0으둜 μ„€μ • ν›„ 1 증가
βœ” 객체 {}λ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ μ„€μ •ν•˜κ³  cur을 ν‚€(key)둜 μ‚¬μš©


5️⃣ 객체 λ°°μ—΄μ˜ ν•© κ΅¬ν•˜κΈ°

let items = [
    { name: "사과", price: 1000 },
    { name: "λ°”λ‚˜λ‚˜", price: 1500 },
    { name: "포도", price: 2000 }
];

let totalPrice = items.reduce((acc, cur) => acc + cur.price, 0);
console.log(totalPrice); // 4500

πŸ”₯ reduce() vs forEach() vs map() 차이

λ©”μ„œλ“œ λͺ©μ  λ°˜ν™˜κ°’ νŠΉμ§•
forEach() λ‹¨μˆœ 반볡 μ‹€ν–‰ μ—†μŒ (undefined) break λΆˆκ°€λŠ₯
map() λ°°μ—΄ λ³€ν™˜ μƒˆλ‘œμš΄ λ°°μ—΄ 원본 λ°°μ—΄ μœ μ§€
reduce() κ°’ μΆ•μ†Œ μ΅œμ’… κ²°κ³Όκ°’ λˆ„μ  μ—°μ‚° κ°€λŠ₯

πŸš€ 정리

 

  • reduce()λŠ” 배열을 ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μ€„μ΄λŠ” λ©”μ„œλ“œ
  • 합계, 평균, μ΅œλŒ€/μ΅œμ†Œκ°’, 개수 μ„ΈκΈ°, 객체 λ³€ν™˜ λ“± ν™œμš© κ°€λŠ₯
  • λˆ„μ κ°’(acc)κ³Ό ν˜„μž¬κ°’(cur)을 μ΄μš©ν•œ 계산 ꡬ쑰
  • reduce()λ₯Ό μ‚¬μš©ν•˜λ©΄ for문보닀 더 κ°„κ²°ν•œ μ½”λ“œ μž‘μ„± κ°€λŠ₯!

 

*μœ„ ν¬μŠ€νŒ…μ€ μ±—GPT 기반으둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€!