TL; DR, 초기 값 설정
파괴 사용
arr.reduce( ( sum, { x } ) => sum + x , 0)
파괴하지 않고
arr.reduce( ( sum , cur ) => sum + cur.x , 0)
Typescript로
arr.reduce( ( sum, { x } : { x: number } ) => sum + x , 0)
파괴 방법을 사용해 봅시다 :
const arr = [ { x: 1 }, { x: 2 }, { x: 4 } ]
const result = arr.reduce( ( sum, { x } ) => sum + x , 0)
console.log( result ) // 7
이것의 핵심은 초기 값을 설정하는 것입니다. 리턴 값은 다음 반복의 첫 번째 매개 변수가됩니다.
최고 답변에 사용 된 기술은 관용적이지 않습니다
수락 된 답변은 "선택적"값을 전달하지 말 것을 제안합니다. 관용적 인 방법은 두 번째 매개 변수가 항상 포함되어 있기 때문에 이것은 잘못 입니다. 왜? 세 가지 이유 :
1. 위험
-콜백 기능이 부주의 한 경우 초기 값을 전달하지 않으면 위험하며 부작용과 돌연변이가 발생할 수 있습니다.
보다
const badCallback = (a,i) => Object.assign(a,i)
const foo = [ { a: 1 }, { b: 2 }, { c: 3 } ]
const bar = foo.reduce( badCallback ) // bad use of Object.assign
// Look, we've tampered with the original array
foo // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
그러나 초기 값으로 이런 식으로 수행 한 경우 :
const bar = foo.reduce( badCallback, {})
// foo is still OK
foo // { a: 1, b: 2, c: 3 }
레코드의 경우, 원래 오브젝트를 변경하지 않으려면 첫 번째 매개 변수를 Object.assign
빈 오브젝트로 설정하십시오 . 이와 같이 : Object.assign({}, a, b, c)
.
2-더 나은 유형 추론
-Typescript와 같은 도구 또는 VS Code와 같은 편집기를 사용하면 컴파일러에 초기를 알리는 이점이 있으며 잘못하면 오류가 발생할 수 있습니다. 초기 값을 설정하지 않으면 많은 상황에서 추측하지 못할 수 있으며 런타임 오류를 초래할 수 있습니다.
3-Functors 존중-JavaScript
는 내부 기능적 자식이 풀릴 때 가장 잘 나타납니다. 기능적 세계에는 "접는"방법이나 reduce
배열 에 대한 표준이 있습니다 . 배열에 변형 을 접거나 적용 할 때 해당 배열의 값을 사용하여 새 유형을 구성합니다. 결과 유형을 전달해야합니다. 최종 유형이 배열, 다른 배열 또는 다른 유형의 값인 경우에도이를 수행해야합니다.
다른 방법으로 생각해 봅시다. JavaScript에서 함수는 데이터처럼 전달 될 수 있습니다. 이것이 콜백이 작동하는 방식입니다. 다음 코드의 결과는 무엇입니까?
[1,2,3].reduce(callback)
숫자를 반환합니까? 객체? 이것은 더 명확하게
[1,2,3].reduce(callback,0)
기능 프로그래밍 사양에 대한 자세한 내용은 https://github.com/fantasyland/fantasy-land#foldable을 참조 하십시오.
더 많은 배경
이 reduce
방법에는 두 가지 매개 변수가 사용됩니다.
Array.prototype.reduce( callback, initialItem )
이 callback
함수는 다음 매개 변수를 사용합니다
(accumulator, itemInArray, indexInArray, entireArray) => { /* do stuff */ }
첫 번째 반복의 경우
항상 Reduce의 초기 값을 설정하는 것을 가르치고 권장합니다.
다음에서 설명서를 확인할 수 있습니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
도움이 되었기를 바랍니다!
arr.reduce(function(a,b){return a + b})
두 번째 예에서 의미 하는 것 같습니다 .