-1

This is different from other similar questions because not one field but campaign, reference and platform should match before adding them THE PROBLEM

A new report will be uploaded daily, I want to be able to combine all reports.

for example:

{ campaign: "a", reference: "ABC-100", value: 4, date: 27/07/2021, platform: "m, n" }
{ campaign: "a", reference: "ABC-200", value: 6, date: 28/07/2021, platform: "l" }
{ campaign: "b", reference: "DEF-100", value: 2, date: 27/07/2021, platform: "j, k" }
{ campaign: "b", reference: "DEF-100", value: 5, date: 28/07/2021, platform: "j, k" }
and so on....

should become (campaigns with different reference should not be combined)

{ campaign: "a", reference: "ABC-100", value: 4, platform: "m, n" }
{ campaign: "a", reference: "ABC-200", value: 6, platform: "l" }
{ campaign: "b", reference: "DEF-100", value: 7, platform: "j, k" }

I need a function that when passed x number of days should combine last x days reports

for example:

combineReports(2)

should combine last two days reports

WHAT I HAVE TRIED

I have tried combining all campaigns based on their reference

function Filter(reportsData) {
  result = [];

  reportsData.forEach(function (a) {
    if (!this[a.reference]) {
      this[a.reference] = {
        campaign: a.campaign,
        reference: a.reference,
        value: 0,
      };
      result.push(this[a.reference]);
    }
    this[a.reference].value += a.value;
  }, Object.create(null));

  console.log("result: ", result);
  return result;
}

export default Filter;
Brijesh
  • 33
  • 6
  • 1
    show us what you have tried. – Shub Aug 16 '21 at 18:42
  • I now added what I have tried, please check – Brijesh Aug 16 '21 at 19:06
  • 1
    Does this answer your question? [Sum javascript object propertyA values with same object propertyB in array of objects](https://stackoverflow.com/questions/19233283/sum-javascript-object-propertya-values-with-same-object-propertyb-in-array-of-ob) – Heretic Monkey Aug 16 '21 at 20:19

2 Answers2

1

Please use this code.

const list = [{ campaign: "a", reference: "ABC-100", value: 4, date: "16/07/2021", platform: "m, n" },
    { campaign: "a", reference: "ABC-200", value: 6, date: "16/07/2021", platform: "l" },
    { campaign: "b", reference: "ABC-100", value: 2, date: "15/07/2021", platform: "j, k" },
    { campaign: "b", reference: "ABC-100", value: 5, date: "14/07/2021", platform: "j, k" }];

function combineReports(num) {
    //Calculate date
    const today = new Date(new Date().getFullYear() + '-' + new Date().getMonth() + '-' + (new Date().getDate() + 1));
    const dayFrom = new Date(today.getTime() - num * 3600 * 24 * 1000);
    const strToDate = (str) => (new Date(str.split('/')[2] + '-' + str.split('/')[1] + '-' + str.split('/')[0]));
    
    //Get compare keys
    const keys = Object.keys(list[0]).filter(val => val !== 'value' && val !== 'date');
    
    //Get sub reports
    const partList = list.filter(val => strToDate(val.date).getTime() < today.getTime() && strToDate(val.date).getTime() >= dayFrom.getTime());
    
    //Combine reports
    const compare = (report1, report2) => (keys.every(val => report1[val] === report2[val]));
    let result = [];
    partList.forEach(val => {
        if(!result.some(value => compare(value, val)))
            result.push(val);
        else 
            result = result.map(obj => (compare(obj, val) ? {...obj, value: obj["value"] + val["value"]} : obj));
    });
    console.log(result);
}

combineReports(3);
Kirill Savik
  • 1,228
  • 4
  • 7
1
//One way is to try reduce    

let arr = [
          {
            campaign: "a",
            reference: "ABC-100",
            value: 4,
            date: 27 / 07 / 2021,
            platform: "m, n",
          },
          {
            campaign: "a",
            reference: "ABC-200",
            value: 6,
            date: 28 / 07 / 2021,
            platform: "l",
          },
          {
            campaign: "b",
            reference: "DEF-100",
            value: 2,
            date: 27 / 07 / 2021,
            platform: "j, k",
          },
          {
            campaign: "b",
            reference: "DEF-100",
            value: 5,
            date: 28 / 07 / 2021,
            platform: "j, k",
          },
        ];
        
        const combine = (data) => {
          let combinedData = data.reduce((acc, curr) => {
        
            delete curr.date
        
            if (acc.length == 0) {       
              acc.push(curr);
              return acc;
            }
        
            let d = acc.find(
              (x) =>
                x.campaign == curr.campaign &&
                x.reference == curr.reference &&
                x.platform == curr.platform
            );
        
            if(d){
                d.value += curr.value
            }
            else{
                acc.push(curr)
            }
        
            return acc
        
        
          }, []);
        
          return combinedData
        };
        
        
        let result = combine(arr)
        
        console.log(result)
R Nair
  • 116
  • 3