var tableMap = { UNIT1:["80", "40"], UNIT2:["50", "60", "90"] }; var averageMap = Object.keys(tableMap).reduce(function(map, key){ var row = tableMap[key]; map[key] = row.reduce(function(sum, value){return sum += parseFloat(value)},0) / row.length return map; },{}); //{UNIT1:60, UNIT2:66.66666666666667}
無理に副作用を嫌ってかえって分かりにくいコードになる図。
分かりやすい回答はa-kuma3さんお願いします。
ベタに書くとこんな感じになります。
var tableMap = { UNIT1:["80", "40"], UNIT2:["50", "60", "90"] }; var averageMap = {}; for (var key in tableMap) { var data = tableMap[key]; var sum = 0; for (var i = 0 ; i < data.length ; ++i) { sum += parseFloat(data[i]); } averageMap[key] = sum / data.length; } console.log(averageMap); // Object { UNIT1: 60, UNIT2: 66.66666666666667 }
やってることは id:Lhankor_Mhy さんが書いたのと同じです。
Array#reduce って、使いどころが難しいメソッドだと思います。
メソッド名を素直に受け取れば、Array#filter メソッドで代替できるし、合計を求めるような N → 1 の「削減する」だったら「集約する」とかの方がメソッド名としてはピンとくるような感じがします。
ランカーさんの回答例にならったコードを回答には書きましたが、前の質問であったようなケースに組み込むのであれば、こんな感じかと。
https://jsfiddle.net/a_kuma3/yecrp2c1/1/
点数の表にくっつけるなら、こんな感じです。
https://jsfiddle.net/a_kuma3/k15k6k2w/2/
# 平均を求める所よりも、見た目を作るところの方が面倒です :-)