Javascript 迭代数组对象并计算平均值

Javascript 迭代数组对象并计算平均值,javascript,Javascript,我有以下数据结构,需要获取竞争者对象中项目的每列的平均值。然后我需要把它转换成一个数组。第一个值必须是列平均值(四舍五入),第二个值必须是从0开始的递增值。e、 g output = [[6, 0], [4, 1], [3, 2], [3, 3], [6, 4]]; 示例结构: input = { categories: [ "Cat 1", "Cat 2", "Cat 3", "Cat 4", "Cat 5" ], contenders:

我有以下数据结构,需要获取竞争者对象中项目的每列的平均值。然后我需要把它转换成一个数组。第一个值必须是列平均值(四舍五入),第二个值必须是从0开始的递增值。e、 g

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;
} 

但是,我还不知道如何迭代这些项的值来获得结果

您可以使用的组合来获取竞争者中的每个项目,然后使用从结果中创建一个新数组:

函数getAvg(数据){ 返回数据.reduce(函数(p,c){ 返回p+c; })/data.length; } 变量输入={ 类别:[ “第一类”, “第二类”, “第三类”, “第四类”, “第5类” ], 竞争者:{ 第1项:[5,3,4,4,6], 第2项:[6,10,4,4,6], 第3项:[6,3,4,9,6], 项目4:[8,3,5,4,6], 项目5:[9,3,4,4,6], 项目6:[10,2,7,4,6], 第7项:[4,3,4,4,6], 项目8:[1,5,4,4,6] }, 杂项:[0,3,4,4,6] }; log(对象.键(输入.竞争者).map(函数(键,索引){ return[getAvg(输入.竞争者[key]),index];
}));您可以使用
Object.keys
获取属性,然后使用
Array.prototype.forEach
对值进行交互

var input={categories:[“第一类”、“第二类”、“第三类”、“第四类”、“第五类”],竞争者:{item1:[5,3,4,4,6],item2:[6,10,4,4,6],item3:[6,3,4,6],item4:[8,3,5,4,6],item6:[10,2,7,4,6],item7:[4,3,4,6],item8:[1,5,4,6],杂项:[0,3,4,6],
输出=[],
总和=[],计数=[];
Object.keys(输入.竞争者).forEach(函数(k){
input.contempers[k].forEach(函数(a,i){
和[i]=(和[i]| 0)+a;
计数[i]=(计数[i]| 0)+1;
});
});
输出=sum.map(函数(a,i){
return[Math.round(sum[i]/count[i]),i]
});

document.write(“”+JSON.stringify(输出,0,4)+“”)如果我理解正确,并且您希望获得每列的平均值,这意味着您的items键中所有数组中的第一个元素就是一个示例,那么您需要为每列创建一个数组以使用平均值函数。但是,在这样做时,您已经可以计算平均值,以下是一种方法:

var input={categories:[“第一类”、“第二类”、“第三类”、“第四类”、“第五类”],竞争者:{item1:[5,3,4,4,6],item2:[6,10,4,4,6],item3:[6,3,4,6],item4:[8,3,5,4,6],item6:[10,2,7,4,6],item7:[4,3,4,6],item8:[1,5,4,6],杂项:[0,3,4,6]
变量输出=[]
var cols=input.contellers.item1.length//列的数量(我假设所有项都有相同数量的列)

对于(var i=0;i您应该完全按照其他答案中的建议使用
Object.keys
。但是,对于完整性或兼容性给您带来麻烦的不太可能的情况: 您可以构建一个字符串来引用正在查找的数组,如下所示


for(var i=1;i为什么输出数组中有8个竞争者,只有5个元素?令人困惑的是,我不明白他想要的是列的平均值,而不是每行的平均值(键)。所以所有的答案都有点误解,因为输出数组需要与类别匹配。如果你不介意的话,还有一个问题。
misc
数组的内容已经是平均值。我只需要让它看起来像这样:
output2=[[9,0],[9,1],[9,2],[9,3],[4,4]]
输出格式相同。最好的方法是什么?@user1513388,
var output2=input.misc.map(函数(a,i){return[a,i];});
应该这样做。
for (var i=1;i<9;i++) { doSomething(input.contenders["item"+i]); }