다음과 같은 정수 배열이 있다고 상상해 봅시다.
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
평균은 다음 공식으로 구합니다.
A = (1 / n) Σxi (i = 1 ~ n 인 경우) ... 그래서 : x1 / n + x2 / n + ... + xn / n
현재 값을 값 수로 나누고 이전 결과를 반환 된 값에 추가합니다.
축소 메소드 서명은
reduce(callback[,default_previous_value])
콜백 감소 기능은 다음 매개 변수를 사용합니다.
- p : 이전 계산 결과
- c : 현재 값 (현재 색인에서)
- i : 현재 배열 요소의 색인 값
- a : 전류 감소 어레이
두 번째 reduce의 매개 변수는 기본값입니다 (배열이 비어 있는 경우에 사용됨 ).
따라서 평균 감소 방법은 다음과 같습니다.
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
원하는 경우 별도의 기능을 만들 수 있습니다
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
그리고 단순히 콜백 메소드 서명을 참조하십시오.
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
또는 어레이 프로토 타입을 직접 보강하십시오.
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
reduce 메소드가 호출 될 때마다 값을 나눌 수 있습니다.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
또는 이전에 정의 된 Array.protoype.sum ()을 사용하여 더 좋습니다 .
방법, 부서를 한 번만 호출하는 프로세스를 최적화하십시오 :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
그런 다음 범위의 모든 Array 객체에서
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB : NaN 희망을 반환하는 빈 배열은 내 관점에서 0보다 정확하며 특정 사용 사례에서 유용 할 수 있습니다.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
훨씬 더 좋을 것입니다.