문제 상황
JavaScript에서 다음과 같은 조건을 만족하는 함수를 작성해야 합니다.
첫 번째 인수로는 두 개의 인수를 받아 하나의 값을 반환하는 콜백 함수를, 두 번째와 세 번째 인수로는 길이가 서로 같은 두 개의 배열을 전달받습니다.
그리고 이 함수는 입력된 두 배열에서 대응하는 요소들을 콜백 함수에 각각 전달한 뒤, 그 반환값들로 구성된 새로운 배열을 만들어 반환해야 합니다.
예제 코드
다음은 위 문제를 해결하는 코드입니다 −
const arr1 = [1, 2, 3, 4];
const arr2 = [5, 6, 7, 8];
const add = (a, b) => a + b;
const applyFunction = (callback = () => {}, arr1 = [], arr2 = []) => {
const res = [];
arr1.forEach((num1, ind) => {
const num2 = arr2[ind];
res.push(callback(num1, num2));
});
return res;
};
console.log(applyFunction(add, arr1, arr2));
출력 결과
[6, 8, 10, 12]
코드 동작 원리
applyFunction 함수는 forEach 메서드를 사용해 첫 번째 배열(arr1)을 순회합니다. 순회 과정에서 현재 인덱스를 기준으로 두 번째 배열(arr2)의 같은 위치에 있는 요소를 가져온 뒤, 두 값을 콜백 함수에 전달합니다.
콜백 함수가 반환한 결과는 미리 선언된 빈 배열 res에 차례대로 저장되며, 모든 요소에 대한 처리가 끝나면 최종적으로 이 배열이 반환됩니다.
위 예제에서는 덧셈을 수행하는 add 함수를 콜백으로 전달했기 때문에, 두 배열의 대응 요소들이 더해진 [6, 8, 10, 12]가 출력됩니다.
map 메서드를 활용한 더 간결한 방법
forEach와 별도의 결과 배열 대신, map 메서드를 사용하면 같은 로직을 한 줄로 더 깔끔하게 표현할 수 있습니다.
const applyFunction = (callback = () => {}, arr1 = [], arr2 = []) =>
arr1.map((num1, ind) => callback(num1, arr2[ind]));map은 콜백의 반환값으로 새로운 배열을 자동으로 생성해 주므로, 불필요한 중간 변수 없이 의도를 명확하게 드러낼 수 있다는 장점이 있습니다.