왜 .reduce()가 지난 2일 동안 많은 혼란을 일으켰습니까?

7009 단어 challengejavascript
이번 달에는 JavaScript 기술을 향상시키기 위해 코딩 카타를 시작했습니다. 어쨌든 저는 휴대폰으로 퍼즐과 퀴즈를 많이 하고, 코딩은 퍼즐을 푸는 것과 그리 멀지 않습니다.

저는 Code Wars을 사용하고 있습니다 - 사이트는 무료이며 다른 사람들의 솔루션을 볼 수 있으며 진행 상황을 볼 수 있는 레벨 시스템이 있습니다. 또한 커뮤니티에 참여하도록 권장합니다. 이는 사람들에게 설치하려는 훌륭한 사고 방식입니다.

인터페이스가 많을 수 있고 순위에 익숙해져야 했음에도 불구하고 훌륭한 도구라는 것을 알았습니다.

adding arrays의 간단한 카타를 하고 있었습니다. kata는 항목 배열이 주어지면 배열에 있는 모든 양수 값의 합계를 반환해야 한다고 요청했습니다.

처음에는 .reduce() 함수를 사용하여 수행할 수 있으므로 배열에 모든 항목을 추가하는 것이 쉬운 작업이라고 생각했습니다. 그러나 모든 테스트를 통과한 것은 아닙니다.

function positiveSum(arr) {
  return arr.length > 0 ? arr.reduce(addAll) : value;
}

function addAll(total, value) {
  return value > 0 ?  total + value : total;
}


입력 배열이 음수 값으로 시작했을 때 테스트가 실패했습니다. 배열에 모든 음수 값이 있는 테스트에서 값이 추가되지 않으므로 0 값이 반환될 것으로 예상합니다. 그러나 대신 arr[0] 값으로 마무리하겠습니다.

불행히도, 나는 총 값(js 랜드에서는 누산기라고도 함)이 0에서 시작했다고 잘못 가정했습니다. 이것은 사실이 아닙니다. 누산기는 배열의 첫 번째 값으로 시작합니다. AND 첫 번째 루프는 배열의 두 번째 항목(arr[1])에서 시작합니다. 예를 들어:

function positiveSum(arr) {
  return arr.length > 0 ? arr.reduce(addAll) : value; 
}

function addAll(total, value) {
  console.log('Total is ' + total + ' and current value is ' + 
  value) 
  return value > 0 ?  total + value : total;
}

let testArray = [-1,-2,-3,-4,-5]; //we expect 0 as all are negative values

positiveSum(testArray); //we get -1

//Output
//Total is -1 and current value is -2
//Total is -1 and current value is -3
//Total is -1 and current value is -4
//Total is -1 and current value is -5

따라서 보다시피 함수는 4번만 호출되며 -1은 초기 누산기 값입니다. 이는 음수 값으로 시작하는 배열의 합계가 잘못되었음을 의미합니다.

위의 내용 외에도 배열이 비어 있을 때 이에 대한 안전 검사도 수행해야 했습니다.

패배, 나는 간단한 .forEach()를 사용하여 카타를 완성했습니다. 이것은 분명히 매력처럼 작동했습니다.

하지만 반전!



동료 코더를 위한 솔루션을 보았을 때 .reduce() 메서드가 실제로 초기 누산기 값을 취할 수 있다는 것을 깨달았습니다!

내가 수정해야 했던 유일한 것은 내 reduce() 함수에서 인수로 0을 추가하는 것이었습니다.

 return arr.reduce(addAll,0);

이것은 반복에 무엇을 합니까? 음, 이제 첫 번째 요소(arr[0])에서 시작하여 배열의 요소당 반복이 있습니다.

빈 배열에 대한 감소 문제도 이 방법으로 해결되었습니다!

최종 솔루션은 다음과 같습니다.

function positiveSum(arr) {
  return arr.reduce(addAll, 0); 
}

function addAll(total, value) {
  return value > 0 ?  total + value : total;
}


이야기의 교훈은 .... 항상 솔루션의 개선 사항을 찾으십시오. :)

문서



MDN docs

좋은 웹페이지 즐겨찾기