[javascript] 배열에서 요소의 합과 평균을 계산하는 방법은 무엇입니까?

배열의 모든 요소를 ​​추가하고 평균화하는 데 문제가 있습니다. 이 작업을 수행하고 현재 보유한 코드로 어떻게 구현합니까? 요소는 아래에있는 것처럼 정의되어야합니다.

<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