평균

1

I는 다음과 같습니다 배열이 있습니다평균

var array = [ [1,3,9], 
       [4,6,8], 
       [3,7,5], 
       [2,8,4] ]; 

나는 각 열의 평균 수를 얻을 싶어하지만 지금 난 그냥 요약하려고했습니다 그들.

var sum = function(arr) { 
    return arr.reduce(function(a, b) { return a + b; }, 0); 
}; 

var tests = array.map(function(v, i) { 
    return sum(array.map(function(v) { return v[i]; })) 
}); 

return tests; 

출력이 올바르게 합을 회전,하지만 컬럼에 해당하는 대신 3의 행 (4 행)만큼의 금액을하는 것 같다 : 이것은 내 코드입니다. 다음은 출력물입니다.

tests = [10, 24, 26, NULL] 

왜 이런 생각입니까? 행 대신 개수가 많은 열에 대해서만 계산을 수행하려면 어떻게합니까?

편집 : 나는 정확한 결과를 제공 Nenad의 대답을 사용하고

. 하지만 Google 스프레드 시트의 스크립트 편집기에 구현해야합니다.이 편집기는 "=>"로 단축 된 기능을 이해하지 못하는 것 같습니다. 나는 더 긴 버전을 위해 단축 된 조각을 바꿨지 만, 나는 같은 결과를 얻지 않을 것이다.

var array = [ [1,3,9], 
 
       [4,6,8], 
 
       [3,7,5], 
 
       [2,8,4] ]; 
 

 
var sums = array.reduce(function(r, e, i) { 
 
    e.forEach(function(a,j) { r[j] = (r[j] || 0) + a; 
 
          if (i == array.length-1) { r = r.map(function(el){ return el/array.length; }); } 
 
          }); 
 
    return r; 
 
    }, []) 
 
    
 
console.log(sums);

나는 이것과 단축 버전의 차이를 볼 수 없습니다, 아직이 하나가 반환

sums = [0.15625, 0.75, 1.34375]; 

대신에 :

sums = [2.5, 6, 6.5]; 

합계가 올바르게 수행되지만, "el/array.length"또는 나눌 때 "el/4", 결과는이 3 개의 이상한 숫자입니다. 나는 어디에서 오는 사람들인지 이해하지 못한다. 나는 어디로 잘못 갔는가?

답변

2

reduce()forEach()을 사용하면 결과를 반환 할 수 있습니다.

var array = [ 
 
    [1, 3, 9], 
 
    [4, 6, 8], 
 
    [3, 7, 5], 
 
    [2, 8, 4] 
 
]; 
 

 
var sums = array.reduce(function(r, e, i) { 
 
    e.forEach((a, j) => r[j] = (r[j] || 0) + a) 
 
    return r; 
 
}, []) 
 

 
console.log(sums)

는 배열의 마지막 반복에 map()을 추가 할 수 있습니다 각 열에 대해 평균을 계산합니다.

var array = [ 
 
    [1, 3, 9], 
 
    [4, 6, 8], 
 
    [3, 7, 5], 
 
    [2, 8, 4] 
 
]; 
 

 
var sums = array.reduce(function(r, e, i) { 
 
    e.forEach((a, j) => r[j] = (r[j] || 0) + a) 
 
    if (i == array.length - 1) r = r.map(el => el/array.length); 
 
    return r; 
 
}, []) 
 

 
console.log(sums)

+1

것은 https://jsfiddle.net/Lg0wyt9u/1440/ –

+0

이 매우 네나드을 감사하십시오! 이 다른 버전은 Google의 스크립트 편집기에서 작동합니다. 나는 괄호로 큰 거래를 엉망으로 만들었다. -_-이 전체 .map/.reduce 함수는 나에게 매우 새롭다. 다시 한번 감사드립니다, 네나드! – ireth92

+0

반갑습니다. –

0

map() + reduce() 솔루션은

var array = [ [1,3,9], [4,6,8], [3,7,5], [2,8,4] ]; 
 

 

 
array.map(function(item, i, arr) { 
 
\t arr[i] = item.reduce((a, b) => a + b, 0)/2; 
 
    \t console.log(arr[i]) 
 
});

내가 여기에 약간의 수정까지 코드
당신이 실수해요210

var array = [ [1,3,9], 
       [4,6,8], 
       [3,7,5], 
       [2,8,4] ]; 
function sum(arr) { 
    return arr.reduce(function(a, b) { return a + b; }, 0); 
}; 

var tests = array.map(function(v, i, arr) { 
    return sum(arr[i]) 
}); 

tests; 
1

각 열의 평균을 얻으려면 먼저 열의 양을 알아야합니다.그런 다음 각 열을 map()으로 잡고 모든 것을 합계 reduce()

이제 열, 합계를 계산 한 다음 열 길이로 나누십시오.

const arrayColumn = (a, n) => a.map(x => x[n]); 
 
const arraySum = (a) => a.reduce((b,c) => b + c); 
 

 
var arr = [ 
 
[1,3,9], 
 
[4,6,8], 
 
[3,7,5], 
 
[2,8,4] 
 
]; 
 

 
for(i=0; i<arr[0].length; i++){ 
 
    console.log(arraySum((col = arrayColumn(arr, i)))/col.length); 
 
}

0

당신은 배열의 배열,
인기있는 유틸리티 라이브러리 (예에 대한 ramda)를 트랜스 수는
전치 구현을 가지고 있지만, 자신의 쉽게 구현할 수 :

const trans = arr => arr[0].map((_,i) => arr.map(x => x[i])) 
 

 
var array = [ 
 
[1,3,9], 
 
[4,6,8], 
 
[3,7,5], 
 
[2,8,4] 
 
]; 
 
const res = trans(array) 
 
console.log(res) 
 

 

 
// to get the sum you can use reduce 
 
console.log(res.map(x => x.reduce((a,b) => a + b)))

1

두 번째 행 배열을 두 번째 열 배열로 변환 한 다음 각 열의 내부 배열을 평균으로 매핑합니다. 내면을 불변성을 줄이기 위해 약간의 상용구가 있습니다. lodash/fp 또는 다른 라이브러리를 사용하여이를 정리할 수 있습니다.

const array = [ 
 
    [1,3,9], 
 
    [4,6,8], 
 
    [3,7,5], 
 
    [2,8,4] 
 
]; 
 

 
const averageColumns = array => array.reduce((acc, row) => { 
 
    return row.reduce((accRow, col, index) => { 
 
    const cols = accRow[index] || []; 
 
    return [...accRow.slice(0, index), cols.concat(col), ...accRow.slice(index + 1)]; 
 

 
    }, acc); 
 
}, []).map(avg); 
 

 
const avg = array => array.reduce((acc, next) => acc + next, 0)/array.length; 
 

 
console.log(averageColumns(array));

0
나는 다음과 같이 할 것

; 의견으로 당

var array = [ [1,3,9], 
 
       [4,6,8], 
 
       [3,7,5], 
 
       [2,8,4] ]; 
 
    result = array.map(a => a.reduce((p,c,_,a) => p + c/a.length,0)); 
 
console.log(result);

... 네 그들은 오른쪽 솔루션은 .map().reduce()의 스위치를 통해해야 옳다;

var array = [ [1,3,9], 
 
       [4,6,8], 
 
       [3,7,5], 
 
       [2,8,4] ], 
 
    result = array.reduce((p,c) => p.map((n,i) => n + c[i]/array.length), Array(array[0].length).fill(0)); 
 
console.log(result);

+2

인덱스의 합계가 아닌 열 합계가 요청됩니다. – Xorifelse