Javascript 如何根据给定的过滤器返回和获取对象属性的总和?

Javascript 如何根据给定的过滤器返回和获取对象属性的总和?,javascript,filter,Javascript,Filter,我有以下目标 var data = [ {"Name":"ABC","Dept":"First","FY":"2016","Quarter":"1","Month":"April","Total":"100"}, {"Name":"ABC","Dept":"Second","FY":"2017","Quarter":"2","Month":"May","Total":"200"}, {"Name":"ABC","Dept":"First","FY":"2016","Quarter":"1","M

我有以下目标

var data = [
{"Name":"ABC","Dept":"First","FY":"2016","Quarter":"1","Month":"April","Total":"100"},
{"Name":"ABC","Dept":"Second","FY":"2017","Quarter":"2","Month":"May","Total":"200"},
{"Name":"ABC","Dept":"First","FY":"2016","Quarter":"1","Month":"June","Total":"150"},
{"Name":"DEF","Dept":"First","FY":"2016","Quarter":"1","Month":"April","Total":"200"},
{"Name":"DEF","Dept":"Second","FY":"2017","Quarter":"2","Month":"May","Total":"100"},
{"Name":"DEF","Dept":"First","FY":"2016","Quarter":"1","Month":"June","Total":"500"}
]
我想对abve对象进行筛选以获得:

a。我想
根据我的过滤器返回总计
(例如:如果我的名字是ABC,部门是First,FY是2016,季度是1,月份是4月,那么它应该
过滤/返回给定过滤器的
总计,即100

b。类似地,我想
返回所有总计的总和
(例如:如果我的名字是ABC,部门是First,FY是2016年-那么它应该
返回所需总值的总和(即100+150=250)
,仅针对给定的
FY

请帮助我在这个要求,我如何才能实现,谢谢

我在下面尝试过,但它给出了给定名称的所有结果(例如:如果我将名称命名为ABC,那么它只返回ABC的所有详细信息)


您可以获取一个具有所需筛选值的对象,然后筛选数组并返回所有
Total
的总和

函数getTotal(数据、过滤器){
var f=对象项(过滤器);
返回数据
.filter(o=>f.every([k,v])=>o[k]==v))
.reduce((s,{Total})=>s++Total,0);
}
var数据=[{Name:“ABC”,Dept:“First”,FY:“2016”,季度:“1”,月:“April”,总计:“100”},{Name:“ABC”,Dept:“Second”,FY:“2017”,季度:“2”,月:“May”,总计:“200”},{Name:“ABC”,Dept:“First”,FY:“2016”,季度:“First”,FY:“First”,FY:“150”{Name:“DEF”,Dept:“First”,FY:“2016”,季度:“1”,月:“四月”,总计:“200”},{名称:“DEF”,部门:“第二”,财政年度:“2017”,季度:“2”,月份:“5”,总计:“100”},{名称:“DEF”,部门:“第一”,财政年度:“2016”,季度:“1”,月份:“6”,总计:“500”};
log(getTotal(数据,{Name:'ABC',Dept:'First',FY:2016,季度:1,月份:'April'}));//100

log(getTotal(数据,{Name:'ABC',Dept:'First',FY:2016}));//100+150=250
您可以获取一个具有所需筛选值的对象,然后筛选数组并返回所有
总数的总和

函数getTotal(数据、过滤器){
var f=对象项(过滤器);
返回数据
.filter(o=>f.every([k,v])=>o[k]==v))
.reduce((s,{Total})=>s++Total,0);
}
var数据=[{Name:“ABC”,Dept:“First”,FY:“2016”,季度:“1”,月:“April”,总计:“100”},{Name:“ABC”,Dept:“Second”,FY:“2017”,季度:“2”,月:“May”,总计:“200”},{Name:“ABC”,Dept:“First”,FY:“2016”,季度:“First”,FY:“First”,FY:“150”{Name:“DEF”,Dept:“First”,FY:“2016”,季度:“1”,月:“四月”,总计:“200”},{名称:“DEF”,部门:“第二”,财政年度:“2017”,季度:“2”,月份:“5”,总计:“100”},{名称:“DEF”,部门:“第一”,财政年度:“2016”,季度:“1”,月份:“6”,总计:“500”};
log(getTotal(数据,{Name:'ABC',Dept:'First',FY:2016,季度:1,月份:'April'}));//100
log(getTotal(数据,{Name:'ABC',Dept:'First',FY:2016}));//100+150=250
您可以使用来完成此操作。根据传递的值过滤数据,然后添加过滤数据的
Total
值以获得最终的总计

var数据=[{“名称”:“ABC”,“部门”:“第一”,“财年”:“2016”,“季度”:“1”,“月”:“4月”,“总计”:“100”},{“名称”:“ABC”,“部门”:“第二”,“财年”:“2017”,“季度”:“2”,“月”:“5月”,“总计”:“200”},{“名称”:“ABC”,“部门”:“第一”,“财年”:“2016”,“季度”:“1”,“月”:“6月”,“总计”:“150”{“名称”:“DEF”,“部门”:“第一”,“财政年度”:“2016年”,“季度”:“1”,“月”:“4月”,“总计”:“200”},{“名称”:“DEF”,“部门”:“第二”,“财政年度”:“2017年”,“季度”:“2”,“月”:“5月”,“总计”:“100”},{“名称”:“DEF”,“部门”:“第一”,“财政年度”:“2016年”,“季度”:“1”,“月”:“6月”,“总计”:“500”};
函数getTotal(过滤器){
var合计=0;
常量filteredData=data.filter(项=>{
for(过滤器中的var键){
如果(项[键]!=过滤器[键]){
返回false;
}
}
返回true;
});
filteredData.forEach(value=>total+=Number(value.total));
返回总数;
}
log(getTotal({“Name”:“ABC”,“Dept”:“First”,“FY”:“2016”});
log(getTotal({“Name”:“DEF”})您可以使用来执行此操作。根据传递的值过滤数据,然后添加过滤数据的
Total
值以获得最终的总计

var数据=[{“名称”:“ABC”,“部门”:“第一”,“财年”:“2016”,“季度”:“1”,“月”:“4月”,“总计”:“100”},{“名称”:“ABC”,“部门”:“第二”,“财年”:“2017”,“季度”:“2”,“月”:“5月”,“总计”:“200”},{“名称”:“ABC”,“部门”:“第一”,“财年”:“2016”,“季度”:“1”,“月”:“6月”,“总计”:“150”{“名称”:“DEF”,“部门”:“第一”,“财政年度”:“2016年”,“季度”:“1”,“月”:“4月”,“总计”:“200”},{“名称”:“DEF”,“部门”:“第二”,“财政年度”:“2017年”,“季度”:“2”,“月”:“5月”,“总计”:“100”},{“名称”:“DEF”,“部门”:“第一”,“财政年度”:“2016年”,“季度”:“1”,“月”:“6月”,“总计”:“500”};
函数getTotal(过滤器){
var合计=0;
常量filteredData=data.filter(项=>{
for(过滤器中的var键){
如果(项[键]!=过滤器[键]){
返回false;
}
}
返回true;
});
filteredData.forEach(value=>total+=Number(value.total));
返回总数;
}
log(getTotal({“Name”:“ABC”,“Dept”:“First”,“FY”:“2016”});

log(getTotal({“Name”:“DEF”})请同时添加您的代码。@NinaScholz添加了我的试用代码请同时添加您的代码。@NinaScholz添加了我的试用代码我已经尝试了上述操作,但Total给出了0(空响应),我不确定为什么,我正试图从Google电子表格访问dialogflow。可能数字不是字符串,如上面的数据所示。您可以尝试使用
==
而不是严格的
==
比较。我已经尝试了上述方法,但Total给出了0(空响应),我不确定为什么,我正在尝试从Google电子表格访问dialogflow。可能数字不是字符串,如上面的数据所示。Y
return getData().then(res => {
            res.data.filter(customerDetails =>{

        if(customerDetails.Name === name && customerDetails.FY === fy && customerDetails.Quarter === quarter &&  customerDetails.Month === month &&  customerDetails.Dept === dept)
           agent.add(`Details: ${name}, Dept: ${customerDetails.Dept}, 
            FY: ${customerDetails.FY}, Quarter: ${customerDetails.Quarter}, Month: ${customerDetails.Month},
            Total: ${customerDetails.Total} `);
             });

             });