Javascript 如何获取数组中的筛选值和求和值?

Javascript 如何获取数组中的筛选值和求和值?,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有以下数组 Array ( [0] => GenderEn: "Male", ProvinceEn: "Chonburi" [1] => GenderEn: "Male", ProvinceEn: "Chonburi" [2] => GenderEn: "Female", ProvinceEn: "Chonburi" [3] =&

我有以下数组

Array
(   [0] => GenderEn: "Male", ProvinceEn: "Chonburi"
    [1] => GenderEn: "Male", ProvinceEn: "Chonburi"
    [2] => GenderEn: "Female", ProvinceEn: "Chonburi"
    [3] => GenderEn: "Female", ProvinceEn: "Chonburi"
    [4] => GenderEn: "Male", ProvinceEn: "BKK"
    [5] => GenderEn: "Female", ProvinceEn: "BKK
)
然后我想从中创建此数组:

Array
(   [0] => Male: "2", Female: "2" Sum : "4" Province : "Chonburi"
    [1] => Male: "1", Female: "1" Sum : "2" Province : "BKK"
)

我如何才能做到这一点?

您可以使用一个对象来存储信息,以省为键

常数arr=[ {性别:男,省:春布里}, {性别:男,省:春布里}, {性别:女性,省:春布里}, {性别:女性,省:春布里}, {性别:男,省:BKK}, {性别:女性,省:BKK} ]; var res=Object.values arr.reduceac,{GenderEn:gender,ProvinceEn:Province}=>{ const p=acc[Province]=acc.hasOwnPropertyProvince?acc[Province]:{男:0,女:0,和:0,省}; p[性别]++,p.Sum++; 返回acc; }, {} ;
console.logres 您必须首先按键对数据分组,在本例中为ProvinceEn。拥有组后,可以将统计信息映射到新对象

我提供了通用的分组和摘要功能

常量原始数据=[ {性别:男,省:春布里}, {性别:男,省:春布里}, {性别:女性,省:春布里}, {性别:女性,省:春布里}, {性别:男,省:BKK}, {性别:女性,省:BKK} ] 常量计数=数据、键、值=> data.filteritem=>item[key]==value.length const groupBy=data,key=> data.ReduceGroup,项=> existingArr=>{…组,[项[键]:[…existingArr,项]} 组[项[键]]| |[],{} const summary=data,groupKey,mapper=> groups=>Object.entriesgroups.mapentry=>mapper.applynull,条目 groupBydata,groupKey console.LogSummaryRawdata,'ProvinceEn',键,数据=>{ “男性”:countdata、“性别”、“男性”, “女性”:countdata、“性别”、“女性”, “Sum”:data.length, “ProvinceEn”:键 } .作为控制台包装{top:0;最大高度:100%!重要;} 常数测试=[ {性别:男,省:春布里}, {性别:男,省:春布里}, {性别:女性,省:春布里}, {性别:女性,省:春布里}, {性别:男,省:BKK}, {性别:女性,省:BKK} ] 函数getProvinceSumarr{ 返回arr.reduceoutput,arrObj=>{ 如果!output.someoutputObj=>outputObj.Province==arrObj.ProvinceEn{ 输出推送{ 男:arrObj.GenderEn==男?1:0, 女:arrObj.GenderEn==女?1:0, 总数:1,, 省:arrObj.ProvinceEn }; }否则{ const outputObj=output.findoutputObj=>outputObj.Province==arrObj.ProvinceEn; arrObj.GenderEn==Male?outputObj.Male+=1:outputObj.Female+=1; outputObj.Sum+=1; } 返回输出; },[]; } console.loggetProvinceSumtest 让我们为这一次打破僵局吧! 由于您特别要求将数组作为输出,而不是对象:

常数数据=[ {性别:男,省:春布里}, {性别:男,省:春布里}, {性别:女性,省:春布里}, {性别:女性,省:春布里}, {性别:男,省:BKK}, {性别:女性,省:BKK} ]; var输出=[]; 用于输入数据{ 设el=output.finde=>e.Province==entry.ProvinceEn; 如果el{//如果输出包含省条目,则向其添加数据 el[entry.GenderEn]+; } else{//else,创建它 输出推送{ 男:entry.GenderEn==“男”?1:0, 女性:entry.GenderEn==“女性”?1:0, get Sum{//如果Sum是一个getter,您将永远不必手动设置它 返回这个。男+这个。女; }, 省:entry.ProvinceEn, }; } } console.logoutput; .作为控制台包装器{top:0;max height:100%!important;}您可以采用一种简单的方法,为未知省份使用默认对象,并对各部分求和,以获得每个省份的分组和

var数据=[{GenderEn:Male,ProvinceEn:Chonburi},{GenderEn:Male,ProvinceEn:Chonburi},{GenderEn:Male,ProvinceEn:Chonburi},{GenderEn:Male,ProvinceEn:BKK},{GenderEn:Femal,ProvinceEn:BKK},{GenderEn:Female,ProvinceEn:BKK}], 结果=Object.valuesdata.reducer,{GenderEn,ProvinceEn:Province}=>{ 如果!r[省]r[省]={男:0,女:0,和:0,省}; r[省][GenderEn]++; r[省].Sum++; 返回r; }, {}; console.logresult;
.作为控制台包装器{max height:100%!important;top:0;}我来这里回答,但我也学到了一些东西。我从未在reduce函数中用参数实例化过对象。多谢各位@hev1@NokPollawat没问题。你能告诉我你的答案吗@约翰帕维克如果其中一个答案解决了你的问题,考虑接受它。谢谢你的解释。Polywhirl先生