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", "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/

相关文章:

javascript - 如何更改 div 的每个第二类的背景

javascript - 从 JSON 数组中提取单个变量

Java Jackson Custom Polymorphc Deserializer 用于加密/解密字段

java - 使用 kafka-streams 有条件地对 json 输入流进行排序

javascript - 使用 DataTables 突出显示列和行

javascript - 如何按键对对象数组进行排序?

javascript - 避免影响加载列表

javascript - 在 Vue JS 中渲染 Markdown

javascript - 使用 React JS 从 JSON 数据创建 TreeView

php - 使用 PHP 后端方法进行 emberjs 数据传输的挫败感