/**
 * reduce() 함수를 사용해서
 * 배열의 모든 요소를 더해 누적된 하나의 값을 생성하는 예제
 */

// reduce() 함수를 적용할 배열
const numbers = [1, 2, 3, 4, 5];

// 개발자가 직접 작성한 콜백 함수
function sum(total, number) {
	// 이전의 결과 값과 현재 요소를 더합니다.
	return total + number;
}

// 배열의 모든 요소에 콜백 함수를 적용하여 집계한 하나의 결과 값을 반환
const result = numbers.reduce(sum);
console.log(result); // 출력: 15
arr.reduce(callbackFn[, initialValue])
// 화살표 함수
reduce((accumulator) => { /* … */ })
reduce((accumulator[, currentValue]) => { /* … */ })
reduce((accumulator[, currentValue[, currentIndex[, array]]]) => { /* … */ })

// 콜백 함수
reduce(callbackFn)
reduce(callbackFn[, initialValue])

// 인라인 콜백 함수
reduce(function (accumulator) { /* … */ })
reduce(function (accumulator[, currentValue]) { /* … */ })
reduce(function (accumulator[, currentValue[, currentIndex[, array]]]) { /* … */ })
reduce(function (accumulator[, currentValue[, currentIndex[, array]]]) { /* … */ }[, initialValue])
callbackFn(accumulator, currentValue[, currentIndex[, array]])
/**
 * 콜백 함수
 *
 * 콜백 함수는 기명 함수(사용자 정의 함수)나 익명 함수 등으로 사용할 수 있습니다.
 * (당연히) 모든 콜백 함수는 화살표 함수로 사용할 수 있습니다.
 */

/* 콜백 함수를 기명 함수를 사용할 경우 */
function callbackFn(accumulator, currentValue[, currentIndex[, array]]) { // 기명 함수 정의
	// 누적된 하나의 값 로직: 누적된 결과를 반환해야 합니다.
}

arr.reduce(callbackFn); // 정의한 기명 함수명을 매개변수에 직접 전달

/* 콜백 함수를 익명 함수로 사용할 경우 */
arr.reduce(function (accumulator, currentValue[, currentIndex[, array]]) {
    // 누적된 하나의 값 로직: 누적된 결과를 반환해야 합니다.
});
const numbers = [1, 2, 3, 4, 5];

const sum = (total, number) => {
	return total + number;
}

const result = numbers.reduce(sum);
console.log(result); // 출력: 15
const numbers = [2, 3, 4, 5];

const sum = (total, number) => {
	return total * number;
}

const result = numbers.reduce(sum, 1);
console.log(result); // 출력: 120
const numbers = [5, 3, 9, 2, 7];

const min = (min, item) => {
    return (item < min) ? item : min;
}

const result = numbers.reduce(min, numbers[0]);
console.log(result); // 출력: 2
const numbers = [5, 3, 9, 2, 7];

const max = (max, item) => {
    return (item > max) ? item : max;
}

const result = numbers.reduce(max, numbers[0]);
console.log(result); // 출력: 9
const numbers = [1, 2, 3, 4, 5];

const square = (accumulator, currentValue) => {
    // 현재 요소의 제곱 값을 계산하고 배열에 추가
    accumulator.push(currentValue * currentValue);
    return accumulator; // 누적된 배열을 반환
}

const squaredArray = numbers.reduce(square, []);

console.log(squaredArray); // 출력: [1, 4, 9, 16, 25]
const numbers = [1, 2, 3, 4, 5];

const square = (currentValue) => {
    return currentValue * currentValue;
}

const squaredArray = numbers.map(square);

console.log(squaredArray); // 출력: [1, 4, 9, 16, 25]

caniuse.com에서 더 자세한 정보를 확인해 보세요.