2015-12-17 81 views
3

我有以下數據結構,需要獲取競爭者對象中各項的每個列的平均值。然後我需要把它變成一個數組數組。第一個值需要是列的平均值(四捨五入),第二個值需要是從0開始遞增的值。對數組對象進行迭代並計算平均值

output = [[6, 0], [4, 1], [3, 2], [3, 3], [6, 4]]; 

結構示例:

input = { 
    categories: [ 
    "Cat 1", 
    "Cat 2", 
    "Cat 3", 
    "Cat 4", 
    "Cat 5" 
    ], 
    contenders: { 
    item1:  [5, 3, 4, 4, 6], 
    item2:  [6, 10, 4, 4, 6], 
    item3:  [6, 3, 4, 9, 6], 
    item4:  [8, 3, 5, 4, 6], 
    item5:  [9, 3, 4, 4, 6], 
    item6:  [10, 2, 7, 4, 6], 
    item7:  [4, 3, 4, 4, 6], 
    item8:  [1, 5, 4, 4, 6] 
    }, 
    misc: [0, 3, 4, 4, 6] 
}; 

我已經創建了一個可以爲我做的平均值的函數:

function getAvg(data) { 
    return data.reduce(function (p, c) { 
       return p + c; 
      })/data.length; 
} 

但不能完全解決如何在迭代項目的值來獲得我的結果。

+1

爲什麼你有8個競爭者,只有5個元素在輸出數組?這是令人困惑的 – gurvinder372

+1

我想他想要的是平均列,而不是每一行(關鍵)。所以所有的答案都被誤解了 – juvian

+0

這是因爲輸出數組需要與類別匹配。 – user1513388

回答

0

您可以使用Object.keys,爲獲取屬性,然後與Array.prototype.forEach交換數值。

var input = { categories: ["Cat 1", "Cat 2", "Cat 3", "Cat 4", "Cat 5"], contenders: { item1: [5, 3, 4, 4, 6], item2: [6, 10, 4, 4, 6], item3: [6, 3, 4, 9, 6], item4: [8, 3, 5, 4, 6], item5: [9, 3, 4, 4, 6], item6: [10, 2, 7, 4, 6], item7: [4, 3, 4, 4, 6], item8: [1, 5, 4, 4, 6] }, misc: [0, 3, 4, 4, 6] }, 
 
    output = [], 
 
    sum = [], count = []; 
 

 
Object.keys(input.contenders).forEach(function (k) { 
 
    input.contenders[k].forEach(function (a, i) { 
 
     sum[i] = (sum[i] || 0) + a; 
 
     count[i] = (count[i] || 0) + 1; 
 
    }); 
 
}); 
 
output = sum.map(function (a, i) { 
 
    return [Math.round(sum[i]/count[i]), i] 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(output, 0, 4) + '</pre>');

+0

完美無瑕。非常感謝。 – user1513388

+0

另一個問題,如果你不介意。 'misc'數組的內容已經被平均。我只需要將它看起來像這樣:'output2 = [[9,0],[9,1],[9,2],[9,3],[4,4]]與' output'。什麼是最好的方法來做到這一點? – user1513388

+0

@ user1513388,'var output2 = input.misc.map(function(a,i){return [a,i];});'應該這樣做。 –

1

你可以使用的Object.keys組合來獲得每個項目在contenders,然後用map創建從結果一個新的數組:

function getAvg(data) { 
 
    return data.reduce(function (p, c) { 
 
    return p + c; 
 
    })/data.length; 
 
} 
 
var input = { 
 
    categories: [ 
 
    "Cat 1", 
 
    "Cat 2", 
 
    "Cat 3", 
 
    "Cat 4", 
 
    "Cat 5" 
 
    ], 
 
    contenders: { 
 
    item1:  [5, 3, 4, 4, 6], 
 
    item2:  [6, 10, 4, 4, 6], 
 
    item3:  [6, 3, 4, 9, 6], 
 
    item4:  [8, 3, 5, 4, 6], 
 
    item5:  [9, 3, 4, 4, 6], 
 
    item6:  [10, 2, 7, 4, 6], 
 
    item7:  [4, 3, 4, 4, 6], 
 
    item8:  [1, 5, 4, 4, 6] 
 
    }, 
 
    misc: [0, 3, 4, 4, 6] 
 
}; 
 
console.log(Object.keys(input.contenders).map(function(key, index) { 
 
    return [getAvg(input.contenders[key]), index]; 
 
}));

2

如果我理解正確的,你想每一列,這意味着每一個第一個元素在你的項目鍵作爲舉例而言,所有陣列的平均值,那麼你就需要做一個每列的數組使用您的平均功能。然而,這樣做你已經可以計算出平均值,這裏是一個辦法:

 var input = { categories: ["Cat 1", "Cat 2", "Cat 3", "Cat 4", "Cat 5"], contenders: { item1: [5, 3, 4, 4, 6], item2: [6, 10, 4, 4, 6], item3: [6, 3, 4, 9, 6], item4: [8, 3, 5, 4, 6], item5: [9, 3, 4, 4, 6], item6: [10, 2, 7, 4, 6], item7: [4, 3, 4, 4, 6], item8: [1, 5, 4, 4, 6] }, misc: [0, 3, 4, 4, 6] } 
 

 

 
    var output = [] 
 

 
    var cols = input.contenders.item1.length // amount of columns (I assume all items have same amount of columns) 
 

 
    for(var i=0;i<cols;i++){ 
 
     output[i] = [0,i] // start output with sum of 0 and index i 
 
    } 
 

 
    for(var key in input.contenders){ 
 
     var arr = input.contenders[key] 
 
     for(var k = 0;k<cols;k++){ 
 
     output[k][0]+=arr[k] // add the value of the array in the kth position to the kth output sum 
 
     } 
 
    } 
 

 
    for(var i=0;i<cols;i++){ 
 
     output[i][0] = Math.round(output[i][0]/Object.keys(input.contenders).length) // now just divide by the amount of keys 
 
    } 
 

 
    console.log(output)

0

你應該完全符合Object.keys走在其他的答案建議。然而,完整性或較少的情況下的兼容性讓你煩惱: 您可以建立一個字符串,它指你正在尋找的陣列,像這樣

for (var i=1;i<9;i++) { doSomething(input.contenders["item"+i]); } 

這需要你知道多少的項目和他們的名字提前。