[英]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.