嗨,我正在努力找出實作某事的最佳方法。我實際上是在進行兩次資料庫呼叫
const [emails] = await dbConnection.execute('SELECT name, programme, timestamp FROM emails');
const [emailsCancelled] = await dbConnection.execute('SELECT data FROM emails where name = "email.cancelled"');
我進行兩次呼叫的原因是我正在處理超過十萬行,并且資料欄位包含相當多的 JSON 資料,所以不想為所有行檢索它。
因此,通過電子郵件,我以以下格式獲取資料
[
{
name: 'email.sent',
programme: 'Email One',
timestamp: 2022-03-24T18:06:02.000Z
},
{
name: 'email.sent',
programme: 'Email Two',
timestamp: 2022-03-24T18:06:02.000Z
},
{
name: 'email.sent',
programme: 'Email One',
timestamp: 2022-03-24T18:06:02.000Z
},
...
]
所以我需要做的是按程式分組,確定發送了多少和總數。我確實獲得了一些其他細節,但在這篇文章中有所減少。為此,我做
const emailsReduced = await emails.reduce((acc, o) => {
const name = o.name?.replace('email.', '');
if (!acc[o.programme]) {
acc[o.programme] = {
count: 0,
sent: 0,
};
}
acc[o.programme].count = (acc[o.programme].count || 0) 1;
acc[o.programme][name] = (acc[o.programme][name]) 1;
return acc;
}, {});
這將回傳這樣的東西
'Email One': {
count: 2,
sent: 2,
},
'Email Two': {
count: 1,
sent: 1,
},
現在 emailsCancelled 回傳 JSON 資料。所以我能做的就是回圈它并在我需要的部分中展示一個例子
Object.entries(emailsCancelled).forEach(([key, value]) => {
const data = JSON.parse(value.data);
if (data?.payload?.body?.toUpperCase() === 'STOP') {
console.log(data?.payload?.correlation?.metadata);
}
});
這將產生這樣的行
[
{ customerId: '12345', programName: 'Email One' },
{ customerId: '2321', programName: 'Email Two' },
{ customerId: '33321', programName: 'Email Two' }
]
現在我需要做的是把它作為一個計數放入原始陣列中。因此,您可以看到電子郵件 1 取消了 1 個,電子郵件 2 取消了 2 個。所以我需要像這樣添加它,根據程式名稱匹配它。
'Email One': {
count: 2,
sent: 2,
cancelled: 1,
},
'Email Two': {
count: 1,
sent: 1,
cancelled: 2,
},
我怎樣才能實作這樣的目標?
謝謝
uj5u.com熱心網友回復:
假設您的資料結構如下所示,您可以根據emails鍵映射和過濾:
const emails = [
{ 'Email One': {
count: 2,
sent: 2,
}},
{'Email Two': {
count: 1,
sent: 1,
}}
]
const canceled = [
{ customerId: '12345', programName: 'Email One' },
{ customerId: '2321', programName: 'Email Two' },
{ customerId: '33321', programName: 'Email Two' }
]
const newmails = emails.map(mail => {
let strmail = Object.keys(mail)
let ncanceled = canceled.filter(item => {
return item.programName == strmail
}).length
mail[strmail].canceled = ncanceled
return mail
})
console.log(newmails)
uj5u.com熱心網友回復:
從 開始emailsCancelled,您可以在執行on之前將陣列縮減為查找Map。查找會將 存盤為鍵,并將該程式的計數存盤為值:.reduce()emailsprogramName
const emails = [
{ customerId: '12345', programName: 'Email One' },
{ customerId: '2321', programName: 'Email Two' },
{ customerId: '33321', programName: 'Email Two' }
];
const lut = emails.reduce((map, {programName}) =>
map.set(programName, (map.get(programName) || 0) 1)
, new Map);
console.log(lut.get("Email One"));
console.log(lut.get("Email Two"));
然后,當您在電子郵件上使用時,您可以使用此查找lut映射來計算值:.reduce()cancelled
const emailsReduced = await emails.reduce((acc, o) => {
const name = o.name?.replace('email.', '');
if (!acc[o.programme]) {
acc[o.programme] = {
count: 0,
sent: 0,
cancelled: lut.get(o.programme)
};
}
acc[o.programme].count = acc[o.programme].count 1;
acc[o.programme][name] = acc[o.programme][name] 1;
return acc;
}, {});
uj5u.com熱心網友回復:
試試這個!
const emails = [{
'Email One': {
count: 2,
sent: 2,
cancelled: 0,
},
},
{
'Email Two': {
count: 1,
sent: 1,
cancelled: 0,
},
},
];
const cancelled_emails = [{
customerId: '12345',
programName: 'Email One'
},
{
customerId: '2321',
programName: 'Email Two'
},
{
customerId: '33321',
programName: 'Email Two'
},
];
for (let cancelled_email of cancelled_emails) {
let prg_name = cancelled_email.programName;
for (email of emails) {
if (Object.keys(email)[0] === prg_name) {
email[prg_name].cancelled = 1;
}
}
}
console.log(emails);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474748.html
