计算多维排序数组(JavaScript)的平均结果

计算多维排序数组(JavaScript)的平均结果,javascript,arrays,Javascript,Arrays,下面是我的JSON文件的布局 { "questions": ["Question1", "Question2"], "orgs": ["Org1", "Org2", "Org3"], "dates": ["Q1", "Q2", "Q3"], "values": [ [ [5, 88, 18], [50, 83, 10], [29, 78, 80] ],

下面是我的JSON文件的布局

{
    "questions": ["Question1", "Question2"],
    "orgs": ["Org1", "Org2", "Org3"],
    "dates": ["Q1", "Q2", "Q3"],
    "values": [
        [
            [5, 88, 18],
            [50, 83, 10],
            [29, 78, 80]

        ],
        [
            [46, 51, 61],
            [95, 21, 15],
            [49, 86, 43]
        ]
    ]
}
我试图通过循环每个问题来检索单个值数组,用“orgs”值索引,然后将检索到的每个值相加,再除以data.dates.length

这是我的密码

d3.json("data.json", function(error, data) {

  var array = new Array()
  var orgS = "Org2"
  var org = data.orgs.indexOf(orgS);

  for (var question = 0; question < data.questions.length; question++) {
    array.push(
      data.values[question][org]
    )

    console.log(array)
  }

  // add array together
  array.reduce(function(a, b) {
    return a + b;
  })

  // calculate average
  var avg = array / data.dates.length;
})
d3.json(“data.json”),函数(错误,数据){
var数组=新数组()
var orgS=“Org2”
var org=data.orgs.indexOf(orgs);
对于(变量问题=0;问题
这是一个plnk

我认为这里的问题是我首先如何检索这些值?与目前一样,尽管我在控制台日志中检索正确的值,但我得到了两次数组,两次都是在嵌套数组中。我不太确定如何解决这个问题

供参考

[问题1][org1]对应于数值[5,88,18]

希望有人能在这里提供一些建议


谢谢

您需要存储总和,即reduce的结果

// add array together
// store in sum
var sum = array.reduce(function(a, b) {
    return a + b;
}, 0); // use 0 as start value
对于平均值,您不需要data.dates的长度,而需要array的长度,因为您需要收集值,并且此长度很重要

// calculate average
var avg = sum / array.length;
对于所有值,您可能会得到以下结果

var数据={“问题”:[“问题1”,“问题2”],“组织机构”:[“组织机构1”,“组织机构2”,“组织机构3”],“日期”:[“第一季度”,“第二季度”,“第三季度”],“价值”:[[5,88,18],[50,83,10],[29,78,80],[46,51,61],[95,21,15],[49,86,43]],
总和=[];
data.values.forEach(函数(a,i){
sum[i]=sum[i]| |[];
a、 forEach(函数(b){
b、 forEach(函数(c,j){
sum[i][j]=sum[i][j]| 0;
和[i][j]+=c;
});
});
});
data.avg=sum.map(函数(a,i){
返回a.map(函数(b){
返回b/data.values[i].length;
});
});
控制台日志(总和);

控制台日志(数据)既然你澄清了你的问题,表明你想为每个问题分别计算平均值,我就重写了我的答案。你应该在for循环中完成所有的计算,因为这个循环是通过问题循环的。然后将平均值存储在一个数组中

d3.json("data.json", function(error, data) {

  var averages = new Array()
  var orgS = "Org2"
  var org = data.orgs.indexOf(orgS);

  var values, sum;

  for (var question = 0; question < data.questions.length; question++) {
    // get the values for the question/org
    values = data.values[question][org];

    // calculate the sum
    sum = values.reduce(function(a, b) {
      return a + b;
    });

    // calculate the average
    averages.push(sum / values.length);
  }

  console.log(averages);

});
d3.json(“data.json”),函数(错误,数据){
var平均值=新数组()
var orgS=“Org2”
var org=data.orgs.indexOf(orgs);
var值,总和;
对于(变量问题=0;问题
执行
for
循环中的
.reduce()
,并将结果推送到
数组中。这将为您提供一系列您期望的结果

array.push(data.values[question][org].reduce(function(a, b) {
  return a + b
}, 0) / data.dates.length)

当前,您正在尝试在
.reduce()
回调中对数组本身执行加法,而不是将每个数组的成员减少到其总和,然后求平均值

演示:(单击下面的文本以显示整个功能)

var数据={
“问题”:[“问题1”、“问题2”],
“组织”:[“组织1”、“组织2”、“组织3”],
“日期”:[“第一季度”、“第二季度”、“第三季度”],
“价值观”:[
[
[5, 88, 18],
[50, 83, 10],
[29, 78, 80]
],
[
[46, 51, 61],
[95, 21, 15],
[49, 86, 43]
]
]
}
x(数据)
//您的回调函数。
函数x(数据){
var数组=新数组()
var orgS=“Org2”
var org=data.orgs.indexOf(orgs);
对于(变量问题=0;问题}
你能发布预期结果吗?@NenadVracar的[question1][org2]=47.66和[question2][org2]=43.66结果应该放在哪里?基本上你会得到6个平均值。嗨,我想这接近我想要的,但这将所有6个数字相加,除以3,我想检索两个单独的数组,每个数组有3个值。因此,初始排序将返回[50,83,10]和[95,21,15],然后返回[143][131]和平均值[47.66][43.66]。抱歉,我认为我在问题中解释得不够好是的,你没有解释(你的代码也没有试图这么做)嗨,这是一个非常好的答案!这给了我一个两难的选择,我选择了宽恕森的答案,因为他以同样的方式加载数据/原始帖子是第一次,但非常感谢这个解决方案!好吧,该死。。我应该先发布一个错误的解决方案!(只是开玩笑,我的答案是“社区维基”,这是有原因的);-)
[
  47.666666666666664,
  43.666666666666664
]