简体   繁体   中英

group the json data and sum the value

I have a set of json value. I want to group the data based on all geo

Identified , Proposal Submitted , QO under Evaluation , Negotiation & Contracting , Closed Lost , Closed Won by count and pipelinevalue

I want to group the json response as

[{SalesStage: "Identified",count:123,pipelinevalue:8},
 {SalesStage: "Proposal Submitted",count:24,pipelinevalue:6},
 {SalesStage: "QO under Evaluation",count:11,pipelinevalue:2},
 {SalesStage: "Qualified",count:8,pipelinevalue:11},
 {SalesStage: "Negotiation & Contracting",count:7,pipelinevalue:16},
 {SalesStage: "Closed Lost",count:37,pipelinevalue:2},
 {SalesStage: "Closed Won",count:4,pipelinevalue:4}]

 const data=[{Geo: "US West", SalesStage: "Identified", count: 34, pipelinevalue: 5}, {Geo: "APAC", SalesStage: "Identified", count: 62, pipelinevalue: 2}, {Geo: "US East", SalesStage: "Identified", count: 27, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Proposal Submitted", count: 4, pipelinevalue: 1}, {Geo: "US East", SalesStage: "Proposal Submitted", count: 14, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Proposal Submitted", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "QO under Evaluation", count: 2, pipelinevalue: 1}, {Geo: "US East", SalesStage: "QO under Evaluation", count: 9, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Qualified", count: 1, pipelinevalue: 6}, {Geo: "US East", SalesStage: "Qualified", count: 1, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Qualified", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "Negotiation & Contracting", count: 3, pipelinevalue: 8}, {Geo: "US East", SalesStage: "Negotiation & Contracting", count: 4, pipelinevalue: 8}, {Geo: "US West", SalesStage: "Closed Lost", count: 37, pipelinevalue: 2}, {Geo: "NSU", SalesStage: "Closed Won", count: 4, pipelinevalue: 4}];
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Here you go. Created a result obj to store the finalResult where key is SalesStage and value is full Obj.

If result does not has any property of current SalesStage add it. If it has the property of SalesStage add the count and pipelinevalue of current obj to the exsiting in result.

 const data=[{Geo: "US West", SalesStage: "Identified", count: 34, pipelinevalue: 5}, {Geo: "APAC", SalesStage: "Identified", count: 62, pipelinevalue: 2}, {Geo: "US East", SalesStage: "Identified", count: 27, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Proposal Submitted", count: 4, pipelinevalue: 1}, {Geo: "US East", SalesStage: "Proposal Submitted", count: 14, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Proposal Submitted", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "QO under Evaluation", count: 2, pipelinevalue: 1}, {Geo: "US East", SalesStage: "QO under Evaluation", count: 9, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Qualified", count: 1, pipelinevalue: 6}, {Geo: "US East", SalesStage: "Qualified", count: 1, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Qualified", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "Negotiation & Contracting", count: 3, pipelinevalue: 8}, {Geo: "US East", SalesStage: "Negotiation & Contracting", count: 4, pipelinevalue: 8}, {Geo: "US West", SalesStage: "Closed Lost", count: 37, pipelinevalue: 2}, {Geo: "NSU", SalesStage: "Closed Won", count: 4, pipelinevalue: 4}]; var result = {}; data.forEach( obj => { if(result.hasOwnProperty(obj.SalesStage)){ var tempObj = result[obj.SalesStage]; tempObj.count+=obj.count; tempObj.pipelinevalue+=obj.pipelinevalue; result[obj.SalesStage]=tempObj; }else { result[obj.SalesStage] = obj; } }) console.log(Object.values(result))

Using forEach

 const data=[{Geo: "US West", SalesStage: "Identified", count: 34, pipelinevalue: 5}, {Geo: "APAC", SalesStage: "Identified", count: 62, pipelinevalue: 2}, {Geo: "US East", SalesStage: "Identified", count: 27, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Proposal Submitted", count: 4, pipelinevalue: 1}, {Geo: "US East", SalesStage: "Proposal Submitted", count: 14, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Proposal Submitted", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "QO under Evaluation", count: 2, pipelinevalue: 1}, {Geo: "US East", SalesStage: "QO under Evaluation", count: 9, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Qualified", count: 1, pipelinevalue: 6}, {Geo: "US East", SalesStage: "Qualified", count: 1, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Qualified", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "Negotiation & Contracting", count: 3, pipelinevalue: 8}, {Geo: "US East", SalesStage: "Negotiation & Contracting", count: 4, pipelinevalue: 8}, {Geo: "US West", SalesStage: "Closed Lost", count: 37, pipelinevalue: 2}, {Geo: "NSU", SalesStage: "Closed Won", count: 4, pipelinevalue: 4}]; var counts={} data.forEach(o=>{ const {SalesStage, count, pipelinevalue}=o if (.counts[o.SalesStage]) {counts[o:SalesStage] ={SalesStage,SalesStage:count,count:pipelinevalue.pipelinevalue}} else {counts[o:SalesStage]={SalesStage,SalesStage:count.count+counts[o.SalesStage],count:pipelinevalue.pipelinevalue+counts[o.SalesStage].pipelinevalue}} }) console.log(Object.values(counts))

This can be achieved using reduce , Object.values and spread operators.

 const data = [{Geo:'US West',SalesStage:'Identified',count:34,pipelinevalue:5},{Geo:'APAC',SalesStage:'Identified',count:62,pipelinevalue:2},{Geo:'US East',SalesStage:'Identified',count:27,pipelinevalue:1},{Geo:'NSU',SalesStage:'Proposal Submitted',count:4,pipelinevalue:1},{Geo:'US East',SalesStage:'Proposal Submitted',count:14,pipelinevalue:4,},{Geo:'US West',SalesStage:'Proposal Submitted',count:6,pipelinevalue:1,},{Geo:'US West',SalesStage:'QO under Evaluation',count:2,pipelinevalue:1,},{Geo:'US East',SalesStage:'QO under Evaluation',count:9,pipelinevalue:1,},{Geo:'NSU',SalesStage:'Qualified',count:1,pipelinevalue:6},{Geo:'US East',SalesStage:'Qualified',count:1,pipelinevalue:4},{Geo:'US West',SalesStage:'Qualified',count:6,pipelinevalue:1},{Geo:'US West',SalesStage:'Negotiation & Contracting',count:3,pipelinevalue:8,},{Geo:'US East',SalesStage:'Negotiation & Contracting',count:4,pipelinevalue:8,},{Geo:'US West',SalesStage:'Closed Lost',count:37,pipelinevalue:2},{Geo:'NSU',SalesStage:'Closed Won',count:4,pipelinevalue:4},]; const finalResult = Object.values(data.reduce((result, {SalesStage, count, pipelinevalue}) => { //There could be a chance(for the first time) that in result object the //corresponding SalesStage object might not be available, so result[SalesStage] //will be undefined. Hence using {count: 0, pipelinevalue: 0} if it is undefined. const obj = result[SalesStage] || {count: 0, pipelinevalue: 0}; return {...result, [SalesStage]: {...obj, SalesStage, count: obj.count + count, pipelinevalue: obj.pipelinevalue + pipelinevalue } } }, {})); console.log(finalResult);

Try to run code below. I created a json object, named "sales_stage", for the final response. Hope it will be solution to your answer.

 const data=[{Geo: "US West", SalesStage: "Identified", count: 34, pipelinevalue: 5}, {Geo: "APAC", SalesStage: "Identified", count: 62, pipelinevalue: 2}, {Geo: "US East", SalesStage: "Identified", count: 27, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Proposal Submitted", count: 4, pipelinevalue: 1}, {Geo: "US East", SalesStage: "Proposal Submitted", count: 14, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Proposal Submitted", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "QO under Evaluation", count: 2, pipelinevalue: 1}, {Geo: "US East", SalesStage: "QO under Evaluation", count: 9, pipelinevalue: 1}, {Geo: "NSU", SalesStage: "Qualified", count: 1, pipelinevalue: 6}, {Geo: "US East", SalesStage: "Qualified", count: 1, pipelinevalue: 4}, {Geo: "US West", SalesStage: "Qualified", count: 6, pipelinevalue: 1}, {Geo: "US West", SalesStage: "Negotiation & Contracting", count: 3, pipelinevalue: 8}, {Geo: "US East", SalesStage: "Negotiation & Contracting", count: 4, pipelinevalue: 8}, {Geo: "US West", SalesStage: "Closed Lost", count: 37, pipelinevalue: 2}, {Geo: "NSU", SalesStage: "Closed Won", count: 4, pipelinevalue: 4}]; var sales_stage = {"Identified": {count:0, pipelinevalue:0}, "Proposal Submitted": {count:0, pipelinevalue:0}, "QO under Evaluation": {count:0, pipelinevalue:0}, "Qualified": {count:0, pipelinevalue:0}, "Negotiation & Contracting": {count:0, pipelinevalue:0}, "Closed Lost": {count:0, pipelinevalue:0}, "Closed Won": {count:0, pipelinevalue:0}} for (i in data) { let item = data[i]; sales_stage[item.SalesStage].count += item.count; sales_stage[item.SalesStage].pipelinevalue += item.pipelinevalue; } console.log (sales_stage)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM