[기수 이동] TIL 7일차

MINGYOUNG KIM·2021년 2월 28일
0

Coplit. 고차함수 17_checkEvenOrNot

(부제: 배열의 메소드 map, filter, reduce는 arr에 있는 모든 원소에 적용하는 메소드이다.)

function checkEvenOrNot(arr) {
let newArr = [];
return arr.map(function(el){
if (el === 0 || el % 2 !== 0) {
newArr.push('no');
}
else if (el % 2 === 0) {
newArr.push('ok');
} return newArr;
})
}

위의 코드는 해당 문제를 풀면서 내가 작성한 오답 코드이다.
레퍼런스와 오답 코드를 두고 다시 공부했을 때 생겼던 의문점은
[ 'ok', 'no' ] 또는 [ 'no', 'ok' ] 처럼 한 번씩 출력되지 않고
[ [ 'ok', 'no' ], [ 'ok', 'no' ] ] 또는 [ [ 'no', 'ok' ], [ 'no', 'ok' ] ] 이렇게 두 번 출력 되는지 그 이유를 모르겠다는 것이었다.

오답:
(1) arr.map은 기본적으로 배열을 리턴하기 때문에 그 안에 newArr로 새로운 배열을 만들면 2중 배열이 된다
(2) arr = [1,2]라고 했을 때
-> return newArr; // arr = [['no'], 2] 현재 newArr를 arr의 0번째 인덱스에 넣고,
-> return newArr; // arr = [['no'], ['no', 'ok']] 현재 newArr를 arr의 1번째 인덱스에 넣는다.

정답:
arr.map으로 리턴되는 배열 안에 문자열로 'ok', 'no'를 리턴하도록 코드를 작성해야 한다.

이유:
return newArr 의 결과값이 어떻게 원래의 배열(arr)에 리턴되는지 제대로 이해하지 못하고 있었다.

map, filter, reduce 추가 설명:
(1) map을 기본형이라고 했을 때, filter는 처리하는 과정에서 '조건'이 들어가고 그 조건에 부합(true)하는 값들만 리턴

map에서는 return a+2라면,
filter에서는 return (a>3) 이라고 할 수 있다.

(2) reduce는 초기값이 있으면 acc에 그 값이 들어가고, 초기 값이 없으면 arr의 0번째 인덱스 값이 acc에 들어간다.

let arr = [2,3,4,5] 일 때,
let arrResult = arr.reduce(function(acc,cur){
return a+b;
},0) // 초기값이 있으므로 acc에 0이 들어간다.
let arrResult = arr.reduce(function(acc,cur){
return a+b;
}) // 초기값이 없으므로 acc은 arr의 0번째 인덱스 2가 들어간다.

참조: https://engineeringshw.blogspot.com/2020/12/mapfilterreducer-javascript.html

profile
개발자가 되기 위해 준비 중인 사람

0개의 댓글