Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于多个过滤器计算json数据的平均值_Javascript_Json - Fatal编程技术网

Javascript 基于多个过滤器计算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

我有一个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。如果任何供应商名称的点数为空,则应将其从平均值计算中排除

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);