Javascript 基于多个过滤器计算json数据的平均值
我有一个json数组,如下所示Javascript 基于多个过滤器计算json数据的平均值,javascript,json,Javascript,Json,我有一个json数组,如下所示 var dataObject=[ { "SupplierName" : "John", "Category " : "A", "Points" : 3 }, { "SupplierName" : "John", "Category " : "A", "Points" : 11 }, { "SupplierName" : "John", "Category " : "A", "Points" : }, { "SupplierName" : "John", "Ca
var dataObject=[
{ "SupplierName" : "John", "Category " : "A", "Points" : 3 },
{ "SupplierName" : "John", "Category " : "A", "Points" : 11 },
{ "SupplierName" : "John", "Category " : "A", "Points" : },
{ "SupplierName" : "John", "Category " : "B", "Points" : 2 },
{ "SupplierName" : "John", "Category " : "B", "Points" : 6 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 3 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 7 }
];
我想找到点的平均值,并以下面的格式创建json。如果任何供应商名称的点数为空,则应将其从平均值计算中排除
var result=[
{ "SupplierName" : "John", "Category " : "A", "Points" : 14, "Average" : 7 },
{ "SupplierName" : "John", "Category " : "B", "Points" : 8, "Average" : 4 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 10, "Average" : 5 }
];
我尝试了下面的代码,但它是基于供应商名称进行过滤的。我不知道如何基于多个值进行过滤。如果你能在这方面指导我,我将不胜感激
var count=0;
var avg=0;
var result = dataObject.reduce(function(res, obj) {
if (!(obj.SupplierName in res)){
count=0;
avg=0;
res.__array.push(res[obj.SupplierName] = obj);
count++;
}
else {
res[obj.SupplierName].Points += obj.Points;
count++;
res[obj.SupplierName].Points =res[obj.SupplierName].Points;
avg=res[obj.SupplierName].Points/count;
res[obj.SupplierName].Average =avg;
}
return res;
}, {__array:[]}).__array
.sort(function(a,b) { return b.SupplierName - a.SupplierName; });
alert(JSON.stringify(result));
编辑:缩短代码:您可以使用哈希表并构建新数组
var-dataObject=[{SupplierName:“John”,Category:“A”,Points:3},{SupplierName:“John”,Category:“A”,Points:null},{SupplierName:“John”,Category:“B”,Points:2},{SupplierName:“John”,Category:“B”,Points:6},{SupplierName:“Praveen”,Category:“A”,Points:3},{供应商名称:“Praveen”,类别:“A”,点数:7}],
hash=Object.create(null),
结果=[];
forEach(函数(a){
var key=['SupplierName','Category'].map(函数(k){returna[k];}).join('|');
如果(a.点===未定义| | a.点===空){
返回;
}
如果(!哈希[键]){
hash[key]={count:0,数据:{SupplierName:a.SupplierName,Category:a.Category,Points:0};
push(散列[key].data);
}
散列[key].data.Points+=a.Points;
散列[key].count++;
});
Object.keys(散列).forEach(函数(k){
哈希[k]。data.Average=hash[k]。data.Points/hash[k]。计数;
});
console.log(结果);
。作为控制台包装{max height:100%!important;top:0;}
您可以使用forEach()
首先创建新数组,然后再次使用递增的对象计算平均值
var-dataObject=[
{“供应商名称”:“约翰”,“类别”:“A”,“点数”:3},
{“供应商名称”:“约翰”,“类别”:“A”,“点数”:11},
{“供应商名称”:“约翰”,“类别”:“A”,“点数”:0},
{“供应商名称”:“约翰”,“类别”:“B”,“点数”:2},
{“供应商名称”:“约翰”,“类别”:“B”,“点数”:6},
{“供应商名称”:“Praveen”,“类别”:“A”,“点数”:3},
{“供应商名称”:“Praveen”,“类别”:“A”,“点数”:7}
];
var result=[],avg={}
forEach(函数(e,i){
var key=e.SupplierName+'|'+e['Category']
如果(!此[键]){
此[键]={“供应商名称”:e.SupplierName,“类别”:e[“类别”],“点数”:0,“平均数”:0}
平均[键]=0
结果。按下(此[键])
}
此[关键点].Points+=e.Points
如果(例如点)平均[键]+=1
}, {})
result.forEach(e=>e.Average=(e.Points/avg[e.SupplierName+'|'+e['Category']]))
console.log(JSON.stringify(result,0,4))
我假设category的键是“category”
,而不是“category”
(带空格)
var-dataObject=[
{“供应商名称”:“约翰”,“类别”:“A”,“点数”:3},
{“供应商名称”:“约翰”,“类别”:“A”,“点数”:11},
{“供应商名称”:“John”,“类别”:“A”,“点”:null},
{“供应商名称”:“约翰”,“类别”:“B”,“点数”:2},
{“供应商名称”:“约翰”,“类别”:“B”,“点数”:6},
{“供应商名称”:“Praveen”,“类别”:“A”,“点数”:3},
{“供应商名称”:“Praveen”,“类别”:“A”,“点数”:7}
];
//首先,积累结果
var结果=数据对象.reduce(函数(acc,项){
//检查我们是否已经有具有相同供应商名称和类别的元素
var FOND=acc.find(功能(e){
返回e[“供应商名称”]==项目[“供应商名称”]&&e[“类别”]==项目[“类别”];
});
//如果存在。。。
如果(找到){
//检查项目是否具有有效的Points值
var值=项目[“点数”];
//如果它有一个有效值,那么。。。
如果(值){
//将其添加到点和。。。
找到[“点”]+=(项目[“点”]| 0);
//增量平均值(平均值将用作以后实际计算实际平均值时的计数器)
找到[“平均”]+;
}
}
//如果它不存在,则将一个新元素推入蓄能器,并使用。。。
否则{
加速推({
“供应商名称”:项目[“供应商名称”],//相同的供应商名称和。。。
“类别”:项目[“类别],//同一类别和。。。
“点”:项[“点”]| | 0,//点的有效值(如果项没有有效值,则为0)和。。。
“平均值”:1//平均值的累加器
});
}
返回acc;
}, []);
//第二,通过……计算实际平均值。。。
结果。forEach(功能(项目){
//…计算实际平均值(你认为会发生什么:D)
项目[“平均”]=项目[“分数”]/项目[“平均”];
});
console.log(result);
使用Array.prototype.reduce()和Object.keys()函数的解决方案:
var-dataObject=[{SupplierName:“John”,Category:“A”,Points:3},{SupplierName:“John”,Category:“A”,Points:null},{SupplierName:“John”,Category:“B”,Points:2},{SupplierName:“John”,Category:“B”,Points:6},{SupplierName:“Praveen”,Category:“A”,Points:3},{供应商名称:“Praveen”,类别:“A”,点数:7}],
groups=dataObject.reduce(函数(r,o){
变量k=o.供应商名称+o.类别;
if(r[k]){
如果(o.Points)(r[k]。Points+=o.Points)和++r[k]。平均值;
}否则{
r[k]=o;
r[k].Average=1;//将“Average”属性作为项目计数器(在第一阶段)
}
返回r;
}, {});
//获得“平均分数”
var result=Object.keys(groups).map(函数(k){
组[k]。平均值=数学.round(组[k]。点/组[k]。平均值);
返回组[k];
});
console.log(结果);
请为“Points is blank”添加值。是否为null
,0var array=[
{ SupplierName : "John", Category : "A", Points : 3 },
{ SupplierName : "John", Category: "A", Points : 5 },
{ SupplierName : "Jennie", Category : "A", Points : 3 },
{ SupplierName : "Jennie", Category: "A", Points : 5 },
];
console.log(array);
//add missing vars
array.forEach(function(elem){
elem["counter"]=1;
elem["Average"]=elem["Points"];
});
//loop trough + join
array.forEach(function(el1){
array.forEach(function(el2,i2){
if(el1===el2){return;}
if(el1.SupplierName===el2.SupplierName && el1.Category===el2.Category){
el1.counter+=el2.counter;
el1.Average+=el2.Average;
console.log("joined",el1,el2);
delete array[i2];
}
});
});
//calculate Average
array.forEach(function(el){
el.Average=el.Average/el.counter;
});
console.log(array);