자바스크립트 reduce함수

reduce()

arr.reduce(callback[, initialValue])
  • callback 함수와 initValue 두 개를 전달
  • 두번째 인자(argument) 인 initValue 는 사용을 해도되고 안해도 되는 선택사항
  • callback 함수에는 총 4개의 인자(argument) 를 지정
  • accumulator 는 콜백의 반환값을 누적, 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서 reduce() 함수의 두번째 인자 initValue를 제공한 경우 initialValue 값
  • currentValue 는 처리할 현재요소, numberList 의 첫번째 데이터 1이 넘어옴
  • currentIndex 는 reduce() 함수의 두번째 인자인 initialValue 를 사용했는지 안했는지에 따라 값이 달라짐, initialValue 를 사용했다면 0 부터, 사용하지 않았다면 1 부터 시작
  • array 는 reduce()를 호출한 배열, 이 예제에서는 numberList
  • 반환값은 누적계산의 결과값

reduce() 작동 방식 - initValue값이 없는 경우

var res = [0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
    console.log(`currentIndex : ${currentIndex}`);
    console.log(`accumulator : ${accumulator}`);
    console.log(`currentValue : ${currentValue}`);
    console.log(`currentIndex : ${currentIndex}`);
    console.log("                              ");
    return accumulator + currentValue;
}, 0);
console.log(res);
// 10

//initialValue를 제공하지 않으면, reduce()는 인덱스 1부터 시작해 콜백 함수를 실행하고 첫 번째 인덱스는 건너 뜁니다.
//reduce()함수 호출시 initialValue 값이 없는 경우
//-accumulator 는 배열의 첫번째 값
//-currentValue 는 배열의 두번째 값

reduce() 작동 방식 - initValue값이 있는 경우

var res = [0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
    console.log(`currentIndex : ${currentIndex}`);
    console.log(`accumulator : ${accumulator}`);
    console.log(`currentValue : ${currentValue}`);
    console.log(`currentIndex : ${currentIndex}`);
    console.log("                              ");
    return accumulator + currentValue;
}, 10);
console.log(res);
// 20

//initialValue를 제공하면 인덱스 0에서 시작합니다.
//reduce()함수 호출시 initialValue 값이 있는 경우
//-accumulator 는 initialValue
//-currentValue 는 배열의 첫번째 값

객체 배열에서의 값 합산

var initialValue = 0;
var list = [
    {
        x : 1
    },
    {
        x : 2
    },
    {
        x : 3
    }
];
var sum = list.reduce(function (accumulator, currentValue) {
    console.log(`accumulator : ${accumulator}`);
    console.log(`currentValue : ${currentValue.x}`);
    console.log("                              ");   
    return accumulator + currentValue.x;
}, initialValue)

console.log(sum)
//6

중첩 배열 펼치기

var arr = [
    [0, 1],
    [2, 3],
    [4, 5]
]
var flattened = arr.reduce(function(accumulator, currentValue) {
        console.log(`accumulator : ${accumulator}`);
        console.log(`currentValue : ${currentValue}`);
        return accumulator.concat(currentValue);
    }
,[]);
console.log(flattened);
//[0, 1, 2, 3, 4, 5]

속성으로 객체 분류하기

var peoples = [
    {
        name : 'Alice',
        age : 21
    },
    {
        name : 'Max',
        age : 20
    },
    {
        name : 'Jane',
        age : 20
    }

];

function groupBy(objectArray, property){
    return objectArray.reduce(function (accumulator, currentObj) {
        var key = currentObj[property];
        console.log(`key : ${key}`);
        if (!accumulator[key]) {
            accumulator[key] = [];
        }
        accumulator[key].push(currentObj);
        return accumulator;
    }, {});
};

var groupedPeople = groupBy(peoples, 'age');
console.log(JSON.stringify(groupedPeople));
//"age" 속성으로 객체 분류 (나이 별)
// {"20":[{"name":"Max","age":20},{"name":"Jane","age":20}],"21":[{"name":"Alice","age":21}]}

배열의 중복 항목 제거

let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
let result = arr.sort().reduce((accumulator, currentValue) => {
    console.log(`accumulator : ${accumulator}`);
    console.log(`currentValue : ${currentValue}`);
    console.log(`                              `);

    const length = accumulator.length
    if (length === 0 || accumulator[length - 1] !== currentValue) {
        accumulator.push(currentValue);
    }
    return accumulator;
}, []);
console.log(result); 
//[1,2,3,4,5]

Comments