배열의 모든 요소를 추가하고 평균화하는 데 문제가 있습니다. 이 작업을 수행하고 현재 보유한 코드로 어떻게 구현합니까? 요소는 아래에있는 것처럼 정의되어야합니다.
<script type="text/javascript">
//<![CDATA[
var i;
var elmt = new Array();
elmt[0] = "0";
elmt[1] = "1";
elmt[2] = "2";
elmt[3] = "3";
elmt[4] = "4";
elmt[5] = "7";
elmt[6] = "8";
elmt[7] = "9";
elmt[8] = "10";
elmt[9] = "11";
// Problem here
for (i = 9; i < 10; i++){
document.write("The sum of all the elements is: " + /* Problem here */ + " The average of all the elements is: " + /* Problem here */ + "<br/>");
}
//]]>
</script>
답변
var sum = 0;
for( var i = 0; i < elmt.length; i++ ){
sum += parseInt( elmt[i], 10 ); //don't forget to add the base
}
var avg = sum/elmt.length;
document.write( "The sum of all the elements is: " + sum + " The average is: " + avg );
값은 문자열이므로 먼저 정수로 변환해야하므로 배열을 반복하십시오. 그리고 평균은 값의 합을 값의 수로 나눈 값입니다.
답변
내가 더 우아하다고 생각하는 해결책 :
const sum = times.reduce((a, b) => a + b, 0);
const avg = (sum / times.length) || 0;
console.log(`The sum is: ${sum}. The average is: ${avg}.`);
답변
ES6
const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
const result = average( [ 4, 4, 5, 6, 6 ] ); // 5
console.log(result);
답변
reduce 및 ES6을 사용하여 평균 (평균) 계산 :
const average = list => list.reduce((prev, curr) => prev + curr) / list.length;
const list = [0, 10, 20, 30]
average(list) // 15
답변
일반적으로 1 라이너 감소를 사용하는 평균은 다음과 같습니다
elements.reduce(function(sum, a,i,ar) { sum += a; return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);
특히 질문에
elements.reduce(function(sum, a,i,ar) { sum += parseFloat(a); return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);
효율적인 버전은
elements.reduce(function(sum, a) { return sum + a },0)/(elements.length||1);
1 분만에 자바 스크립트 배열 축소 이해
http://www.airpair.com/javascript/javascript-array-reduce
gotofritz가 지적했듯이 Array.reduce는 정의되지 않은 값을 건너 뜁니다. 그래서 여기에 수정이 있습니다.
(function average(arr){var finalstate=arr.reduce(function(state,a) { state.sum+=a;state.count+=1; return state },{sum:0,count:0}); return finalstate.sum/finalstate.count})([2,,,6])
답변
다음과 같은 정수 배열이 있다고 상상해 봅시다.
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보다 정확하며 특정 사용 사례에서 유용 할 수 있습니다.
답변
당신은 또한 사용할 수 있습니다 lodash (다른 편리한 물건이) 수학 부분에, _.sum (배열)과 _.mean (배열).
_.sum([4, 2, 8, 6]);
// => 20
_.mean([4, 2, 8, 6]);
// => 5