计算多维排序数组(JavaScript)的平均结果
下面是我的JSON文件的布局计算多维排序数组(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] ],
{
"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
]