我有一个 json 数组,如下所示。
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。如果任何 SupplierName 的 Points 为空,则应将其排除在平均计算之外。
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 }
];
我试过下面的代码,但它是根据 SupplierName 进行过滤的。我不确定如何根据多个值进行过滤。如果您能指导我,我将不胜感激。
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));
最佳答案
使用Array.prototype.reduce()
和Object.keys()
函数的解决方案:
var dataObject = [{ SupplierName: "John", Category: "A", Points: 3 }, { SupplierName: "John", Category: "A", Points: 11 }, { SupplierName: "John", Category: "A", Points: null }, { SupplierName: "John", Category: "B", Points: 2 }, { SupplierName: "John", Category: "B", Points: 6 }, { SupplierName: "Praveen", Category: "A", Points: 3 }, { SupplierName: "Praveen", Category: "A", Points: 7 }],
groups = dataObject.reduce(function (r, o) {
var k = o.SupplierName + o.Category;
if (r[k]) {
if (o.Points) (r[k].Points += o.Points) && ++r[k].Average;
} else {
r[k] = o;
r[k].Average = 1; // taking 'Average' attribute as an items counter(on the first phase)
}
return r;
}, {});
// getting "average of Points"
var result = Object.keys(groups).map(function (k) {
groups[k].Average = Math.round(groups[k].Points/groups[k].Average);
return groups[k];
});
console.log(result);
关于javascript - 根据多个过滤器从 json 数据计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41901720/