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

时间:2016-06-16 13:32:51

标签: javascript arrays

下面是我的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;
})

这是一个plnk;

http://plnkr.co/edit/wMv8GmkD1ynjo9WZVlMb?p=preview

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

供参考;

[question1] [org1]对应于值[5,88,18]。

希望有人可以在这里提供一些建议吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

由于您澄清了您的问题以表明您想要计算每个问题的单独平均值,我已经重写了我的答案。你应该在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);

});

答案 1 :(得分:1)

.reduce()循环中执行for并将结果推送到array。这将为您提供一系列您期望的结果。

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

[
  47.666666666666664,
  43.666666666666664
]

目前,您尝试在.reduce()回调中对数组本身执行添加,而不是将每个数组的成员减少到它们的总和,然后平均。

演示: (点击下面的文字显示整个功能)

var data = {
  "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]
    ]
  ]
}

x(data)

// Your callback function.
function x(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].reduce(function(a, b) {
      return a + b
    }, 0) / data.dates.length)
  }

  console.log(array)
}

您可以使用for

,而不是.map()循环
var array = data.questions.map(function(_, question) {
  return data.values[question][org].reduce(function(a, b) {
    return a + b
  }, 0) / data.dates.length
})

演示: (点击下面的文字显示整个功能)

var data = {
  "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]
    ]
  ]
}

x(data)

// Your callback function.
function x(data) {
  var orgS = "Org2"
  var org = data.orgs.indexOf(orgS);

  var array = data.questions.map(function(_, question) {
    return data.values[question][org].reduce(function(a, b) {
      return a + b
    }, 0) / data.dates.length
  })

  console.log(array)
}

答案 2 :(得分:0)

你需要存储总和,即减少的结果。

// add array together
// store in sum
var sum = array.reduce(function(a, b) {
    return a + b;
}, 0); // use 0 as start value

对于平均值,您不需要data.dates的长度,而是需要数组,因为您收集值并且此长度很重要。

// calculate average
var avg = sum / array.length;

对于所有值,您可能会得到此

&#13;
&#13;
var data = { "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]]] },
    sum = [];

data.values.forEach(function (a, i) {
    sum[i] = sum[i] || [];
    a.forEach(function (b) {
        b.forEach(function (c, j) {
            sum[i][j] = sum[i][j] || 0;
            sum[i][j] += c;
        });
    });
});

data.avg = sum.map(function (a, i) {
    return a.map(function (b) {
        return b / data.values[i].length;
    });
});

console.log(sum);
console.log(data);
&#13;
&#13;
&#13;