Pure Reduce 함수 - Aggregator를 상태로 사용
Array.reduce()
를 사용할 때 우리는 부작용을 사용하는 경향이 있습니다(예: let
변수 또는 범위를 벗어난 개체 정의 및 반복하는 동안 수정).다음은 애그리게이터를 상태로 사용하여 축소 기능을 순수하게 유지하는 쉬운 방법입니다.
모든 숫자를 합산하고 가장 큰 숫자를 두 번 더하는 감소 함수를 고려하십시오.
이전에 변경 가능한 변수를 선언하고 이를 사용하여 가장 큰 숫자를 추적한 다음 축소가 완료된 후에 추가할 수 있습니다.
let biggestNum = Number.NEGATIVE_INFINITY;
const sum = arr.reduce(
(agg, val) => {
biggestNum = Math.max(val, biggestNum);
return agg + val;
},
0,
);
const sumAndBiggest = sum + biggestNum;
또는 reduce 함수 내부에 모든 관련 논리를 캡슐화할 수 있습니다.
const sumAndBiggest = arr.reduce(
(agg, val, index, sourceArr) => {
if (index === sourceArr.length - 1) {
return agg.sum + val + agg.biggestNum;
}
return {
sum: agg.sum + val,
biggestNum: Math.max(val, agg.biggestNum),
};
},
{ sum: 0, biggestNum: Number.NEGATIVE_INFINITY },
);
두 가지를 알 수 있습니다.
이 방법은 reduce 함수에 조금 더 많은 논리를 추가합니다. 그렇다면 왜 사용해야 합니까?
축소 작업에 필요한 모든 데이터를 캡슐화할 수 있기 때문입니다. 이는 다음을 의미합니다.
biggestNum
변수가 다른 곳에서 사용되고 있는지 걱정할 필요가 없습니다. 안타깝게도 TypeScript는
reduce
에 대해 하나의 반환 값을 정의하는 옵션만 제공하며 최종 반환 값과 중간 반환 값을 구분할 수 없습니다.즉, reduce 함수를 두 유형을 모두 반환할 수 있도록 정의하고
as
키워드를 사용하여 애그리게이터의 유형을 사용하기 전에 확인해야 합니다.interface IReduceState {
sum: number,
biggestNum: number;
}
const sumAndBiggest = arr.reduce<number | IReduceState>(
(agg, val, index, sourceArr) => {
const { sum, biggestNum } = agg as IReduceState
if (index === sourceArr.length - 1) {
return sum + val + biggestNum;
}
return {
sum: sum + val,
biggestNum: Math.max(val, biggestNum),
};
},
{ sum: 0, biggestNum: Number.NEGATIVE_INFINITY },
);
이것에 대한 더 좋은 해결책이 있다면 알려주세요!
즐거운 코딩하세요!
Yonatan Kra 친절한 리뷰를 남겨주셔서 감사합니다.
Reference
이 문제에 관하여(Pure Reduce 함수 - Aggregator를 상태로 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mimafogeus2/pure-reduce-functions-use-aggregator-as-a-state-32h6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)