reduce()

|

- 배열 각 요소에 대하여 reducer 함수(사용자 정의)를 실행하고, 하나의 결과값을 반환
- array의 모든 요소들에 대해 체크하고 누적된 값을 출력하고 싶을 때 용이

- for문이나 count를 위한 별도의 변수를 선언하지 않고도 바로 결과가 출력됨

arr.reduce(callback[, initialValue])

callback function
1. 다음 4가지의 인수를 가집니다.
   accumulator - accumulator는 callback함수의 반환값을 누적
   currentValue - 배열의 현재 요소
   index(Optional) - 배열의 현재 요소의 인덱스
   array(Optional) - 호출한 배열
2. callback함수의 반환 값은 accumulator에 할당되고 순회중 계속 누적되어 최종적으로 하나의 값을 반환

 

// initialValue(Optional)
- 최초 callback함수 실행 시 accumulator 인수에 제공되는 값
- 초기값을 제공하지 않을경우 배열의 첫 번째 요소를 사용하고, 빈 배열에서 초기값이 없을 경우 에러가 발생

// 예시코드
const number = [1, 2, 3, 4, 5];

function reducer(accumulator, currentValue, currentIndex) {
  const result = accumulator + currentValue;
  console.log('accumulator = ', accumulator, ', currentValue = ', currentValue, ', currentIndex = ', currentIndex, ', result = ', result);
  return result;
}

// initialValue가 없을 경우
number.reduce(reducer);

// 동작
// accumulator = 1, currentValue = 2, currentIndex = 1, result = 3
// accumulator = 3, currentValue = 3, currentIndex = 2, result = 6
// accumulator = 6, currentValue = 4, currentIndex = 3, result = 10
// accumulator = 10, currentValue = 5, currentIndex = 4, result = 15

// initialValue가 있을 경우
number.reduce(reducer, 0);

// 동작
// accumulator = 0, currentValue = 1, currentIndex = 0, result = 1
// accumulator = 1, currentValue = 2, currentIndex = 1, result = 3
// accumulator = 3, currentValue = 3, currentIndex = 2, result = 6
// accumulator = 6, currentValue = 4, currentIndex = 3, result = 10
// accumulator = 10, currentValue = 5, currentIndex = 4, result = 15
const empDataColumns = [
    'seq',
    'empId',
    'empNm',
    'nickNm',
    'executiveYn',
    'orgId',
    'posCd',
    'posNm',
    'photo'
];
const orgDataColumns = [
    'seq',
    'companySeq',
    'orgId',
    'orgNm',
    'orgNmEn',
    'orgNmZh',
    'sortOrder',
    'upOrgId',
    'orgTypeCd'
];
export const basicData = {
    EMP_LIST: [],
    ORG_LIST: []
};

const limit = {
    orgData: 14,
    empData: 3
};

const orgIdMap = ['F00001', 'MA0001', 'MA0002', 'F00002', 'MB0001', 'MB0002', 'F00003', 'MC0001', 'MC0002', 'F00004', 'MD0001', 'MD0002', 'F00005', 'ME0001', 'ME0002'];
const orgNm = ['마케팅', '상품', '디자인', '상품 관리', '품질', '가격', '컨텐츠', '컨텐츠 개발', '법률', '서포트', '세일즈 마케팅', '방송', '사람과 문화', '고객 가치 발굴', '조직 의사 소통'];
const sortOrder = [1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2];
const upOrgId = ['CA000', 'F00001', 'F00001', 'CA000', 'F00002', 'F00002', 'CB000', 'F00003', 'F00003', 'CB000', 'F00004', 'F00004', 'CC000', 'F00005', 'F00005'];
const orgTypeCd = [1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2];

const firstName = ['김', '이', '박', '최', '윤'];
const secondName = ['성', '선', '우', '지', '태'];
const thirdName = ['미', '준', '규', '호', '영'];

const nickFirstName = ['A', 'D', 'B', 'Z', 'P'];
const nickSecondName = ['e', 'a', 'i', 'o', 'u'];
const nickThirdName = ['w', 'r', 'm', 'w', 'q'];

const executiveYn = ['Y', 'N', 'N', 'Y', 'Y'];

const posMap = {
    posCd1: '사원',
    posCd2: '대리',
    posCd3: '과장'
}

let k = 0;
for (let i = 0; i <= limit.orgData; i++) {

    let orgData = {};
    orgDataColumns.reduce((acc, curr) => {
        if (curr.toUpperCase() === 'SEQ') {
            acc[curr] = `${i}`;
        } else if (curr === 'orgId') {
            acc[curr] = orgIdMap[i];
        } else if (curr === 'orgNm') {
            acc[curr] = orgNm[i];
        } else if (curr === 'sortOrder') {
            acc[curr] = sortOrder[i];
        } else if (curr === 'upOrgId') {
            acc[curr] = upOrgId[i];
        } else if (curr === 'orgTypeCd') {
            acc[curr] = orgTypeCd[i];
        } else {
            acc[curr] = `${curr}${i}`;
        }
        return acc;
    }, orgData);

    for (let j = 1; j <= limit.empData; j++) {

        if (orgData.orgId.indexOf('F') > -1) {
            continue;
        };

        let empData = {};
        empDataColumns.reduce((acc, curr) => {

            if (curr === 'orgId') {
                acc[curr] = orgData.orgId;
            } else {
                if (curr.toUpperCase() === 'SEQ') {
                } else if (curr.toUpperCase() === 'COMPANYSEQ') {
                    acc[curr] = `1`;
                } else if (curr === 'empId') {
                    acc[curr] = `E0000${k}`;
                } else if (curr === 'empNm') {
                    acc[curr] = firstName[Math.floor(Math.random() * firstName.length)] + secondName[Math.floor(Math.random() * secondName.length)] + thirdName[Math.floor(Math.random() * thirdName.length)]
                } else if (curr === 'nickNm') {
                    acc[curr] = nickFirstName[Math.floor(Math.random() * nickFirstName.length)] + nickSecondName[Math.floor(Math.random() * nickSecondName.length)] + nickThirdName[Math.floor(Math.random() * nickThirdName.length)]
                } else if (curr === 'executiveYn') {
                    acc[curr] = executiveYn[j]
                } else if (curr === 'posNm') {
                    acc[curr] = posMap['posCd' + j]
                } else {
                    acc[curr] = `${curr}${j}`;
                }
            }

            k++;

            return acc;
        }, empData);

        basicData.EMP_LIST.push(empData);
    }

    basicData.ORG_LIST.push(orgData);
}
// 배열 관련 reduce 예제

var sample = [];

res.SSP_EMP_SIMUL_DATA_BIND_CD.reduce(function (acc, cur) {
    // if(cur.code === 'ddd') // 특정 조건에 따른 비즈니스 로직
    
    acc.push(cur);

    return acc; // 누적된 배열을 return
}, sample); // 초기 배열은 빈값

console.log(sample); // 결과 배열
And