예시로 나와있는 문제가 너무 쉬워서; 좀 여러가지를 가져와봤다.
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로 하면 이거면 끝..^^
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분정도 걸린 것 같은데; 프로그래머스 풀면서 올려보겠다