Array.reduce()

예시로 나와있는 문제가 너무 쉬워서; 좀 여러가지를 가져와봤다.

reduce는 이러한 구조를 가지고 있다

Array.reduce(function(acc,cur,index,arr){[initalValue]}

function은 콜백이니까 그냥 무시하고

순서대로 첫번째 요소,현재 요소, 현재 인덱스값, 배열이다.
initvalValue는 최초 호출에서 첫번째 제공하는 값이라고 적혀있는데 선언을 안하면 배열의 첫번째 요소부터 시작한다.
만약 배열에 담아야할 경우에는 []를 선언하고 객체에 담아야할때는 {}를 선언해놓으면 된다.

reduce는 어지간한것들을 다 구현할 수 있어서 이것만 잘 다룰 줄 알아도 다 이걸로 쌈싸먹을 수 있다.... 그래서 진짜 난해하다고 생각하고 있다.

그럼 일단 차근차근 한발씩 나아가보자.

배열에 담긴 요소의 합을 구하시오.

const num = [6,2,4,3,1,7,5]
console.log(num.reduce((a,b) => a+b))
num.reduce((6,2) => 6+2)
num.reduce((8,4) => 8+4)
이런식으로 진행된다

진짜, 진짜 짧고 단순하게 다룰 수 있다.
어떤 구조로 진행이 되냐면 바로 reduce가 시작하자마자 바로 a는 6이 담기고 b에는 2가 담긴다.
그리고 a+b의 과정을 거쳐서 a는 8이 되고 b에는 그 다음 수인 4가 들어오게 되서
배열이 끝날 때까지 진행을 하여 답이 나오게 된다.
어디에 담고 싶다면 저장을 따로 해주고, 함수를 끝내고 싶으면 콘솔 대신에 리턴을 넣으면 된다.

배열에 담긴 요소의 평균을 구하시오.

const num = [6,2,4,3,1,7,5]
console.log(num.reduce((a,b) => a+b) / num.length)

정말..쉽게 쓸 수 있다.
수를 모두 합친 후 num.length으로 나눠주면 끝난다.

배열의 중복 요소를 없애시오.

const num = [1,2,1,2]
num.reduce((a,b) => a.includes(b) ? a : [...a,b],[]);

엄마 그냥 나 필터쓰면 안돼? 이거 이해하는데 진짜 오래걸렸어

reduce()가 시작되면 a에는 이니셜값으로 빈 배열을 선언했기에 []로 시작된다

num.reduce(([],1) => [].includes(1) ? [] : [...[],1],[]);
[]에는 1이 존재하지 않기에 삼항 연산자가 false를 가리켜서
[...[],1]에 의해서 두개가 합쳐져서 [1]이 된다.

num.reduce(([1],2) => [1].includes(2) ? [1] : [...[1],2],[]);
[1]에는 2가 존재하지 않기 때문에 false를 가리켜서 [1,2]가 된다.

num.reduce(([1,2],1) => [1,2].includes(1) ? [1,2] : [...[1],1],[]);
[1,2]에는 1이 존재하기 때문에 true를 가리켜서 변화없이 [1,2]로 빠진다

num.reduce(([1,2],2) => [1,2].includes(2) ? [1,2] : [...[1],2],[]);

[1,2]에는 2가 존재하기 때문에 true를 가리켜서 변화없이 [1,2]로 빠진 후
num의 배열이 종료했기에 값은 [1,2]가 된다.

배열의 짝수를 나타내시오. (filter가 편함;)

filter로 하면 이거면 끝..^^
const num = [1,2,3,4,5,6]
num.filter( a => a%2 === 0)

reduce()구현
const num = [1,2,3,4,5,6]
num.reduce((a,b) => b % 2 === 0 ? [...a,b] : a,[]);

살짝 해설을 해보면

num.reduce(([],1) => 1 % 2 === 0 ? [...[],1] : a,[]);
false니까 a인 []부터 다시 시작
num.reduce(([],2) => 2 % 2 === 0 ? [...[],2] : a,[]);
true니까 [2]가 담겨서 다시 시작하는 이런 구조로 가지고 있다.

좀 더 다양한 활용이 있을 것 같은데, 아직 내 수준에서는 이보다 더 많은 것들은 해석이 안된다. 솔직히 중복없애는것도 한 30분정도 걸린 것 같은데; 프로그래머스 풀면서 올려보겠다

좋은 웹페이지 즐겨찾기