我有一個像這樣的資料結構:
[
{"Day": "12-06-2021", "ROAS": 17.3, "ConversionRate": 0.1472, "VisitRate": 0.0488},
{"Day": "12-07-2021", "ROAS": 14.79, "ConversionRate": 0.1251, "VisitRate": 0.0555},
{"Day": "12-08-2021", "ROAS": 17.12, "ConversionRate": 0.1358, "VisitRate": 0.052},
{"Day": "12-09-2021", "ROAS": 14.95, "ConversionRate": 0.1391, "VisitRate": 0.0537},
{"Day": "12-10-2021", "ROAS": 19.85, "ConversionRate": 0.1394, "VisitRate": 0.0853},
{"Day": "12-11-2021", "ROAS": 25.03, "ConversionRate": 0.1565, "VisitRate": 0.1033},
{"Day": "12-12-2021", "ROAS": 24.58, "ConversionRate": 0.1528, "VisitRate": 0.1172},
{"Day": "12-13-2021", "ROAS": 14.2, "ConversionRate": 0.1517, "VisitRate": 0.0481},
{"Day": "12-14-2021", "ROAS": 14.32, "ConversionRate": 0.1564, "VisitRate": 0.0488},
{"Day": "12-15-2021", "ROAS": 12.54, "ConversionRate": 0.1436, "VisitRate": 0.0473},
{"Day": "12-16-2021", "ROAS": 14.47, "ConversionRate": 0.1574, "VisitRate": 0.0442},
{"Day": "12-17-2021", "ROAS": 18.2, "ConversionRate": 0.1283, "VisitRate": 0.0729},
{"Day": "12-18-2021", "ROAS": 72.93, "ConversionRate": 0.1366, "VisitRate": 0.2267},
{"Day": "12-19-2021", "ROAS": 72.29, "ConversionRate": 0.1638, "VisitRate": 0.1715}
]
我正在嘗試做的事情對我來說似乎是不可能的,因為我經常在日期數學上掙扎,所以我希望你們中的一個天才可以幫助我。
我要做的是將這些每日資料匯總到一個物件中,該物件為我提供三個屬性中每一個的每周平均值。我想出的是一堆嵌套的 foreaches,我無法保持頭腦清醒。
我也很樂意使用任何 npm 模塊。任何讓這更容易的事情
uj5u.com熱心網友回復:
因此,這是從先前答案中獲取的從日期中獲取周數的被盜代碼。
function getWeek(date) {
if (!(date instanceof Date)) date = new Date();
// ISO week date weeks start on Monday, so correct the day number
var nDay = (date.getDay() 6) % 7;
// ISO 8601 states that week 1 is the week with the first Thursday of that year
// Set the target date to the Thursday in the target week
date.setDate(date.getDate() - nDay 3);
// Store the millisecond value of the target date
var n1stThursday = date.valueOf();
// Set the target to the first Thursday of the year
// First, set the target to January 1st
date.setMonth(0, 1);
// Not a Thursday? Correct the date to the next Thursday
if (date.getDay() !== 4) {
date.setMonth(0, 1 ((4 - date.getDay()) 7) % 7);
}
// The week number is the number of weeks between the first Thursday of the year
// and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
return 1 Math.ceil((n1stThursday - date) / 604800000);
}
哪個給你一個日期的周數。現在您所需要的只是根據周數將您的陣列分組為周。
var data = [
{"Day": "12-06-2021", "ROAS": 17.3, "ConversionRate": 0.1472, "VisitRate": 0.0488},
{"Day": "12-07-2021", "ROAS": 14.79, "ConversionRate": 0.1251, "VisitRate": 0.0555},
{"Day": "12-08-2021", "ROAS": 17.12, "ConversionRate": 0.1358, "VisitRate": 0.052},
{"Day": "12-09-2021", "ROAS": 14.95, "ConversionRate": 0.1391, "VisitRate": 0.0537},
{"Day": "12-10-2021", "ROAS": 19.85, "ConversionRate": 0.1394, "VisitRate": 0.0853},
{"Day": "12-11-2021", "ROAS": 25.03, "ConversionRate": 0.1565, "VisitRate": 0.1033},
{"Day": "12-12-2021", "ROAS": 24.58, "ConversionRate": 0.1528, "VisitRate": 0.1172},
{"Day": "12-13-2021", "ROAS": 14.2, "ConversionRate": 0.1517, "VisitRate": 0.0481},
{"Day": "12-14-2021", "ROAS": 14.32, "ConversionRate": 0.1564, "VisitRate": 0.0488},
{"Day": "12-15-2021", "ROAS": 12.54, "ConversionRate": 0.1436, "VisitRate": 0.0473},
{"Day": "12-16-2021", "ROAS": 14.47, "ConversionRate": 0.1574, "VisitRate": 0.0442},
{"Day": "12-17-2021", "ROAS": 18.2, "ConversionRate": 0.1283, "VisitRate": 0.0729},
{"Day": "12-18-2021", "ROAS": 72.93, "ConversionRate": 0.1366, "VisitRate": 0.2267},
{"Day": "12-19-2021", "ROAS": 72.29, "ConversionRate": 0.1638, "VisitRate": 0.1715}
];
function getWeek(date) {
!(date instanceof Date) && (date = new Date());
var nDay = (date.getDay() 6) % 7;
date.setDate(date.getDate() - nDay 3);
var n1stThursday = date.valueOf();
date.setMonth(0, 1);
(date.getDay() !== 4) && date.setMonth(0, 1 ((4 - date.getDay()) 7) % 7);
return 1 Math.ceil((n1stThursday - date) / 604800000);
}
var groups = data.reduce( function(r,d){
var week = getWeek(new Date(d.Day));
r[week] = r[week] ? r[week].concat(d)
: [d]
return r;
}, {}),
result = Object.keys(groups)
.map(week => groups[week] = groups[week].reduce((a,o) => ( a.ROAS = o.ROAS / groups[week].length
, a.ConversionRate = o.ConversionRate / groups[week].length
, a.VisitRate = o.VisitRate / groups[week].length
, a
) ,{"Week":week, "ROAS":0, "ConversionRate": 0, "VisitRate":0}));
console.log(result);
uj5u.com熱心網友回復:
您可以使用 reduce 將每個資料項分組為周,并再次映射資料以計算平均值。
這是我的嘗試,希望它與您的預期相似:
function getWeek(date) {
var onejan = new Date(date.getFullYear(), 0, 1);
var millisecsInDay = 86400000;
return Math.ceil(
((date - onejan) / millisecsInDay onejan.getDay() 1) / 7
);
}
const data = [
{ Day: "12-06-2021", ROAS: 17.3, ConversionRate: 0.1472, VisitRate: 0.0488 },
{ Day: "12-07-2021", ROAS: 14.79, ConversionRate: 0.1251, VisitRate: 0.0555 },
{ Day: "12-08-2021", ROAS: 17.12, ConversionRate: 0.1358, VisitRate: 0.052 },
{ Day: "12-09-2021", ROAS: 14.95, ConversionRate: 0.1391, VisitRate: 0.0537 },
{ Day: "12-10-2021", ROAS: 19.85, ConversionRate: 0.1394, VisitRate: 0.0853 },
{ Day: "12-11-2021", ROAS: 25.03, ConversionRate: 0.1565, VisitRate: 0.1033 },
{ Day: "12-12-2021", ROAS: 24.58, ConversionRate: 0.1528, VisitRate: 0.1172 },
{ Day: "12-13-2021", ROAS: 14.2, ConversionRate: 0.1517, VisitRate: 0.0481 },
{ Day: "12-14-2021", ROAS: 14.32, ConversionRate: 0.1564, VisitRate: 0.0488 },
{ Day: "12-15-2021", ROAS: 12.54, ConversionRate: 0.1436, VisitRate: 0.0473 },
{ Day: "12-16-2021", ROAS: 14.47, ConversionRate: 0.1574, VisitRate: 0.0442 },
{ Day: "12-17-2021", ROAS: 18.2, ConversionRate: 0.1283, VisitRate: 0.0729 },
{ Day: "12-18-2021", ROAS: 72.93, ConversionRate: 0.1366, VisitRate: 0.2267 },
{ Day: "12-19-2021", ROAS: 72.29, ConversionRate: 0.1638, VisitRate: 0.1715 },
];
const aggregatedData = data
.reduce((acc, val) => {
const date = new Date(val.Day);
const weekNum = getWeek(date);
const weekYear = `${weekNum}-${date.getFullYear()}`;
const lastWeekYear = acc[acc.length - 1]?.weekYear;
if (lastWeekYear === weekYear) {
acc[acc.length - 1].data.push(val);
return acc;
} else {
return [...acc, { weekYear, data: [val] }];
}
}, [])
.map(({ weekYear, data }) => {
const [roasCount, roasSum] = data.reduce(
(acc, val) => [acc[0] 1, acc[0] val.ROAS],
[0, 0]
);
const roasAverage = roasSum / roasCount;
const [conversionRateCount, conversionRateSum] = data.reduce(
(acc, val) => [acc[0] 1, acc[0] val.ConversionRate],
[0, 0]
);
const conversionRateAverage = conversionRateSum / conversionRateCount;
const [visitRateCount, visitRateSum] = data.reduce(
(acc, val) => [acc[0] 1, acc[0] val.VisitRate],
[0, 0]
);
const visitRateAverage = visitRateSum / visitRateCount;
return {
weekYear,
averages: { roasAverage, conversionRateAverage, visitRateAverage },
};
});
console.log(aggregatedData);
如果您已經在使用諸如 lodash 之類的庫,則絕對可以將其清理為更少量的代碼。
uj5u.com熱心網友回復:
這是我對 dayjs 的嘗試(可以輕松更改為 moment)https://jsfiddle.net/wajsc548/7/
所以我在這里做的是回圈資料,將日期轉換為星期并將其用作存盤值總數的鍵 一個計數器以確定添加了多少值
然后我再次回圈它以獲得平均值。
let data =[
{"Day": "12-06-2021", "ROAS": 17.3, "ConversionRate": 0.1472, "VisitRate": 0.0488},
{"Day": "12-07-2021", "ROAS": 14.79, "ConversionRate": 0.1251, "VisitRate": 0.0555},
{"Day": "12-08-2021", "ROAS": 17.12, "ConversionRate": 0.1358, "VisitRate": 0.052},
{"Day": "12-09-2021", "ROAS": 14.95, "ConversionRate": 0.1391, "VisitRate": 0.0537},
{"Day": "12-10-2021", "ROAS": 19.85, "ConversionRate": 0.1394, "VisitRate": 0.0853},
{"Day": "12-11-2021", "ROAS": 25.03, "ConversionRate": 0.1565, "VisitRate": 0.1033},
{"Day": "12-12-2021", "ROAS": 24.58, "ConversionRate": 0.1528, "VisitRate": 0.1172},
{"Day": "12-13-2021", "ROAS": 14.2, "ConversionRate": 0.1517, "VisitRate": 0.0481},
{"Day": "12-14-2021", "ROAS": 14.32, "ConversionRate": 0.1564, "VisitRate": 0.0488},
{"Day": "12-15-2021", "ROAS": 12.54, "ConversionRate": 0.1436, "VisitRate": 0.0473},
{"Day": "12-16-2021", "ROAS": 14.47, "ConversionRate": 0.1574, "VisitRate": 0.0442},
{"Day": "12-17-2021", "ROAS": 18.2, "ConversionRate": 0.1283, "VisitRate": 0.0729},
{"Day": "12-18-2021", "ROAS": 72.93, "ConversionRate": 0.1366, "VisitRate": 0.2267},
{"Day": "12-19-2021", "ROAS": 72.29, "ConversionRate": 0.1638, "VisitRate": 0.1715}
];
let average = {};
data.forEach(day => {
let week = dayjs(day.Day, "MM-DD-YYYY").isoWeek();
let averageWeek = average[[week]];
if (averageWeek) {
average = {...average, [week]: {"ROAS": day.ROAS averageWeek.ROAS, "ConversionRate": day.ConversionRate averageWeek.ConversionRate, "VisitRate": day.VisitRate averageWeek.VisitRate, count: averageWeek.count 1}};
}
else {
average = {...average, [week]: {"ROAS": day.ROAS, "ConversionRate": day.ConversionRate, "VisitRate": day.VisitRate, count: 1}};
}
});
let newData = [];
Object.entries(average).forEach(
([key, value]) => {
newData.push({"Week": key, "ROAS": value.ROAS/value.count, "ConversionRate": value.ConversionRate/value.count, "VisitRate": value.VisitRate/value.count})
}
);
console.log(newData);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405600.html
標籤:
