简体   繁体   English

根据属性组合多个项目

[英]Combine multiple items based on properties

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我需要一个 function,当经过 x 天后应该合并最近 x 天的报告

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;

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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