JavaScript
reduce()
매료매료
2023. 1. 10. 13:46
- 배열 각 요소에 대하여 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); // 결과 배열