我有一系列訂單,我需要根據運營商代碼對它們進行分組:
const orders = [
{
"depo": "Berlin",
"boxes": 1,
"isCOD": true,
"CODAmount": 45.33,
"carrierCode": "ups",
"sid": "DCAC298A627DF2D1980D23F67F05E8E4",
},
{
"depo": "Leipzig",
"boxes": 2,
"isCOD": false,
"CODAmount": 0,
"carrierCode": "tnt",
"sid": "8BF93B9159742250CA7F73304808E316",
},
{
"depo": "Leipzig",
"boxes": 2,
"isCOD": true,
"CODAmount": 124.00,
"carrierCode": "dhl",
"sid": "0DC1A9BCFA6C5834361AFABBD857CEDD",
},
{
"depo": "Leipzig",
"boxes": 3,
"isCOD": true,
"CODAmount": 415.33,
"carrierCode": "tnt",
"sid": "8BF93B9159742250CA7F73304808E316",
},
{
"depo": "Berlin",
"boxes": 1,
"isCOD": false,
"CODAmount": 0,
"carrierCode": "tnt",
"sid": "0DC1A9BCFA6C5834361AFABBD857CEDD",
}
];
到目前為止,我是這樣做的:
var groups = orders.reduce((p, c) => {
var code = c.carrierCode;
if (!p.hasOwnProperty(code)) {
p[code] = 0;
}
p[code] ;
return p;
}, {});
console.log(groups);
var countsExtended = Object.keys(groups).map(k => {
return {code: k, orderscount: groups[k]}; });
console.log(countsExtended);
回傳
{ ups: 1, tnt: 3, dhl: 1 }
和
[
{ code: 'ups', orderscount: 1 },
{ code: 'tnt', orderscount: 3 },
{ code: 'dhl', orderscount: 1 }
]
但現在我還需要按 depo 分組并從訂單中“匯入”一些其他值,例如箱數和總 COD 金額:實際上,我應該得到這樣的東西
[
{ code: 'ups', orderscount: 1, depo:'Berlin', boxes: 1, CODAmount: 45.33},
{ code: 'tnt', orderscount: 1, depo:'Berlin', boxes: 1, CODAmount: 0.00},
{ code: 'tnt', orderscount: 2, depo:'Leipzig', boxes: 5, CODAmount: 415.33},
{ code: 'dhl', orderscount: 1, depo:'Leipzig', boxes: 2, CODAmount: 124.00}
]
我怎樣才能用 ES6/ES10 得到這個?
謝謝
uj5u.com熱心網友回復:
這是一種利用第一個reduce()函式以及擴展運算子來獲得所需內容的方法。
const orders = [{ depo: 'Berlin', boxes: 1, isCOD: true, CODAmount: 45.33, carrierCode: 'ups', sid: 'DCAC298A627DF2D1980D23F67F05E8E4', }, { depo: 'Leipzig', boxes: 2, isCOD: false, CODAmount: 0, carrierCode: 'tnt', sid: '8BF93B9159742250CA7F73304808E316', }, { depo: 'Leipzig', boxes: 2, isCOD: true, CODAmount: 124.0, carrierCode: 'dhl', sid: '0DC1A9BCFA6C5834361AFABBD857CEDD', }, { depo: 'Leipzig', boxes: 3, isCOD: true, CODAmount: 415.33, carrierCode: 'tnt', sid: '8BF93B9159742250CA7F73304808E316', }, { depo: 'Berlin', boxes: 1, isCOD: false, CODAmount: 0, carrierCode: 'tnt', sid: '0DC1A9BCFA6C5834361AFABBD857CEDD', },];
const groups = orders.reduce((p, c) => {
delete c.sid;
delete c.isCOD;
let index = p.findIndex(pi => pi.carrierCode == c.carrierCode && pi.depo == c.depo);
if (index > -1) {
p[index].ordercounts ;
p[index].CODAmount = c.CODAmount;
p[index].boxes = c.boxes;
}
else p.push({ ...c, ordercounts: 1});
return p;
}, []);
console.log(groups);
uj5u.com熱心網友回復:
你不需要做任何額外的事情,你可以簡單地在你的reduce().
這里使用解構來隔離屬性,并使用邏輯空賦值(??=)稍微簡化邏輯
const orders = [{ depo: 'Berlin', boxes: 1, isCOD: true, CODAmount: 45.33, carrierCode: 'ups', sid: 'DCAC298A627DF2D1980D23F67F05E8E4', }, { depo: 'Leipzig', boxes: 2, isCOD: false, CODAmount: 0, carrierCode: 'tnt', sid: '8BF93B9159742250CA7F73304808E316', }, { depo: 'Leipzig', boxes: 2, isCOD: true, CODAmount: 124.0, carrierCode: 'dhl', sid: '0DC1A9BCFA6C5834361AFABBD857CEDD', }, { depo: 'Leipzig', boxes: 3, isCOD: true, CODAmount: 415.33, carrierCode: 'tnt', sid: '8BF93B9159742250CA7F73304808E316', }, { depo: 'Berlin', boxes: 1, isCOD: false, CODAmount: 0, carrierCode: 'tnt', sid: '0DC1A9BCFA6C5834361AFABBD857CEDD', },];
const groups = Object.values(
orders.reduce((p, { carrierCode: code, depo, boxes, CODAmount }) => {
p[code] ??= { code, orderscount: 0, depo: {} };
p[code]['depo'][depo] ??= { depo, boxes: 0, CODAmount: 0 };
p[code]['depo'][depo].boxes = boxes;
p[code]['depo'][depo].CODAmount = CODAmount;
p[code].orderscount = 1;
return p;
}, {})
).map(({ depo, ...rest }) => ({ ...rest, depo: Object.values(depo) }));
console.log(Object.values(groups));
uj5u.com熱心網友回復:
我把結果放在有點不同的結構中
const result = {};
orders.forEach(({ carrierCode, depo, boxes, CODAmount }) => {
if (!result[carrierCode]) {
result[carrierCode] = {};
}
if (!result[carrierCode][depo]) {
result[carrierCode][depo] = { boxes, CODAmount, orderscount: 1 };
} else {
result[carrierCode][depo].boxes = boxes;
result[carrierCode][depo].CODAmount = CODAmount;
result[carrierCode][depo].orderscount ;
}
});
結果:
{
"ups": {
"Berlin": {
"boxes": 1,
"CODAmount": 45.33,
"orderscount": 1
}
},
"tnt": {
"Leipzig": {
"boxes": 5,
"CODAmount": 415.33,
"orderscount": 2
},
"Berlin": {
"boxes": 1,
"CODAmount": 0,
"orderscount": 1
}
},
"dhl": {
"Leipzig": {
"boxes": 2,
"CODAmount": 124,
"orderscount": 1
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/370113.html
上一篇:如何通過從1到最后一個而不是從零開始來回圈列出包含物件的陣列Javascript
下一篇:具有相同值的過濾器陣列
