본문 바로가기

Front End/Javascript

[JavaScript] 배열 reduce(), reduceRight()

arr.reduce() 와 arr.reduceRight()

reduce와 reduceRight는 배열을 기반으로 값 하나를 도출할 때 사용됩니다.

let value = arr.reduce(callback(accumulator, currentValue, index, array), initialValue);
배열.reduce(callback(누적값, 현재값, 인덱스, 요소), 초기값);

Array.reduceRight() : 끝 인덱스 부터 시작한다는 점을 제외하고는 reduce()와 유사하다.

 


reduce()는 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback 함수를 한 번씩 실행하는데, 콜백 함수는 다음의 네 인수를 받습니다:
- accumulator
- currentValue
- currentIndex
- array

콜백의 최초 호출 때 accumulator와 currentValue는 다음 두 가지 값 중 하나를 가질 수 있습니다.
만약 reduce() 함수 호출에서 initialValue를 제공한 경우, accumulator는 initialValue와 같고 currentValue는 배열의 첫 번째 값과 같습니다.
initialValue를 제공하지 않았다면, accumulator는 배열의 첫 번째 값과 같고 currentValue는 두 번째와 같습니다.

 

매개변수로 함수만 전달한 경우

let sum = ar.reduce((total, value)=> total + value);
 

두번째 매개 변수로 초기값을 전달한 경우


sum  =  ar.reduce(function(acc, item, index, array){
       console.log(`${acc} - ${item} - ${index} - ${array}`)
          return acc + item;
}, 100);

 

reduce를 이용하여 팩토리알 값을 구해보자


factorial = [1, 2, 3, 4, 5].reduce((acc, item, index)=>{
          console.log(`${acc} - ${item} - ${index}`)
          return acc * item;
}, 1);

 

 

ex12.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<!DOCTYPE html>
<html lang="ko">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>javascript Array</title>
    <script>
        let ar = [];
        for (let i = 0; i < 10; i++) ar.push(i+1);
        document.write(`${ar.length}개 : ${ar}<br>`);
 
        let sum = ar.reduce((total, value)=> total + value);
        document.write(`합계 : ${sum}<br>`);
        sum = ar.reduce(function(acc, item, index, array){
          console.log(`${acc} - ${item} - ${index} - ${array}`)  
          return acc + item; 
        }, 100);
        document.write(`합계 : ${sum}<br><hr>`);
        
        let factorial = [12345].reduce((s, n)=> s * n);
        document.write(`10! = ${factorial}<br>`);
        factorial = [12345].reduce((acc, item, index)=>{
            console.log(`${acc} - ${item} - ${index}`)  
            return acc * item;
        }, 1);
        document.write(`10! = ${factorial}<br><hr>`);
        
        let str = [1122334455].reduce((acc, item, index, array)=> `${acc} array[${index}] = ${item} = ${array[index]}<br>`, '');
        document.write(`${str}<br><hr>`);
        
        const zodiac1 = "쥐,소,호랑이,토끼,용,뱀,말,양,원숭이,닭,개,돼지".split(",");
        const zodiac2 = "자,축,인,묘,진,사,오,미,신,유,술,해".split(",");
        const zodiac3 = "子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥".split(",");
        
        str = zodiac1.reduce((acc, item, index)=>`${acc} ${item}(${zodiac2[index]}, ${zodiac3[index]})<br>`,'');
        document.write(`${str}<br><hr>`);
 
        // Array.reduceRight() : 끝 인덱스 부터 시작한다는 점을 제외하고는 reduce()와 유사하다.
        str = zodiac1.reduceRight((acc, item, index)=>`${acc} ${item}(${zodiac2[index]}, ${zodiac3[index]})<br>`,'');
        document.write(`${str}<br><hr>`);
 
        factorial = [12345].reduceRight((acc, item, index)=>{
            console.log(`${acc} - ${item} - ${index}`)  
            return acc * item;
        }, 1);
        document.write(`10! = ${factorial}<br><hr>`);
    </script>
</head>
 
<body>
 
</body>
 
</html>
cs

 

 

실행 결과 입니다.