如何在空数组上调用 reduce 并分配新属性
How to call reduce over empty array and assign new properties
我有一个具有默认属性和两个数组的对象,其中一个是空的。
空数组在某些情况下有可能不为空,但我仍然想循环它。如果数组为空,则不会调用 reduce,并且我会丢失一些属性,因此我的想法是在对象中包含一些默认属性,以防数组为空。预期的结果是这样的:
[{
"playedOffTickets": 60,
"playedOffRevenue": 1730.5,
"Transactions.deliveryMethod": "Print At Home Delivery",
"soldTickets": 0,
"soldRevenue": 0,
},
{
"playedOffTickets": 43,
"playedOffRevenue": 1160,
"Transactions.deliveryMethod": "Postal Delivery",
"soldTickets": 0,
"soldRevenue": 0,
},
{
"playedOffTickets": 12,
"playedOffRevenue": 348,
"Transactions.deliveryMethod": "Cobo Delivery",
"soldTickets": 0,
"soldRevenue": 0,
},
{
"playedOffTickets": -3,
"playedOffRevenue": -87,
"Transactions.deliveryMethod": "",
"soldTickets": 0,
"soldRevenue": 0,
}];
但是我得到的响应不是我想要的。我究竟做错了什么?提前致谢!
const productMap = {
soldTickets: 0,
soldRevenue: 0,
playedOffTickets: 0,
playedOffRevenue: 0,
};
const arr1 = [];
const arr2 = [
{
"Transactions.deliveryMethod": "Print At Home Delivery",
"Transactions.itemCount": "60",
"Transactions.revenue": "1730.5"
},
{
"Transactions.deliveryMethod": "Postal Delivery",
"Transactions.itemCount": "43",
"Transactions.revenue": "1160"
},
{
"Transactions.deliveryMethod": "Cobo Delivery",
"Transactions.itemCount": "12",
"Transactions.revenue": "348"
},
{
"Transactions.deliveryMethod": "",
"Transactions.itemCount": "-3",
"Transactions.revenue": "-87"
}
];
arr1.reduce((p, salesData) => {
const product = salesData["Transactions.deliveryMethod"];
p[product] = p[product] || {};
const soldTickets = Number(salesData["Transactions.itemCount"]);
const soldRevenue = Number(salesData["Transactions.revenue"]);
p[product].soldTickets = p[product].soldTickets || 0;
p[product].soldTickets += soldTickets;
p[product].soldRevenue = p[product].soldRevenue || 0;
p[product].soldRevenue += soldRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
arr2.reduce((p, playedOffData) => {
const product = playedOffData["Transactions.deliveryMethod"];
p[product] = p[product] || {};
const playedOffTickets = Number(playedOffData["Transactions.itemCount"]);
const playedOffRevenue = Number(playedOffData["Transactions.revenue"]);
p[product].playedOffTickets = p[product].playedOffTickets || 0;
p[product].playedOffTickets += playedOffTickets;
p[product].playedOffRevenue = p[product].playedOffRevenue || 0;
p[product].playedOffRevenue += playedOffRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
const productMapData = Object.values(productMap);
console.log(productMapData)
我建议添加一个 productMapDefaults
对象,只要我们想在 productMap 对象中创建一个新条目,我们就会使用它。
然后可以根据需要自定义以添加新属性。
const productMap = {};
const productMapDefaults = {
soldTickets: 0,
soldRevenue: 0,
playedOffTickets: 0,
playedOffRevenue: 0
}
const arr1 = [];
const arr2 = [
{
"Transactions.deliveryMethod": "Print At Home Delivery",
"Transactions.itemCount": "60",
"Transactions.revenue": "1730.5"
},
{
"Transactions.deliveryMethod": "Postal Delivery",
"Transactions.itemCount": "43",
"Transactions.revenue": "1160"
},
{
"Transactions.deliveryMethod": "Cobo Delivery",
"Transactions.itemCount": "12",
"Transactions.revenue": "348"
},
{
"Transactions.deliveryMethod": "",
"Transactions.itemCount": "-3",
"Transactions.revenue": "-87"
}
];
arr1.reduce((p, salesData) => {
const product = salesData["Transactions.deliveryMethod"];
// Use productMapDefaults as template when creating new entry...
p[product] = p[product] || { ...productMapDefaults };
const soldTickets = Number(salesData["Transactions.itemCount"]);
const soldRevenue = Number(salesData["Transactions.revenue"]);
p[product].soldTickets = p[product].soldTickets || 0;
p[product].soldTickets += soldTickets;
p[product].soldRevenue = p[product].soldRevenue || 0;
p[product].soldRevenue += soldRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
arr2.reduce((p, playedOffData) => {
const product = playedOffData["Transactions.deliveryMethod"];
// Use productMapDefaults as template when creating new entry...
p[product] = p[product] || { ...productMapDefaults };
const playedOffTickets = Number(playedOffData["Transactions.itemCount"]);
const playedOffRevenue = Number(playedOffData["Transactions.revenue"]);
p[product].playedOffTickets = p[product].playedOffTickets || 0;
p[product].playedOffTickets += playedOffTickets;
p[product].playedOffRevenue = p[product].playedOffRevenue || 0;
p[product].playedOffRevenue += playedOffRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
const productMapData = Object.values(productMap);
console.log(productMapData)
.as-console-wrapper { max-height: 100% !important; top: 0; }
我有一个具有默认属性和两个数组的对象,其中一个是空的。 空数组在某些情况下有可能不为空,但我仍然想循环它。如果数组为空,则不会调用 reduce,并且我会丢失一些属性,因此我的想法是在对象中包含一些默认属性,以防数组为空。预期的结果是这样的:
[{
"playedOffTickets": 60,
"playedOffRevenue": 1730.5,
"Transactions.deliveryMethod": "Print At Home Delivery",
"soldTickets": 0,
"soldRevenue": 0,
},
{
"playedOffTickets": 43,
"playedOffRevenue": 1160,
"Transactions.deliveryMethod": "Postal Delivery",
"soldTickets": 0,
"soldRevenue": 0,
},
{
"playedOffTickets": 12,
"playedOffRevenue": 348,
"Transactions.deliveryMethod": "Cobo Delivery",
"soldTickets": 0,
"soldRevenue": 0,
},
{
"playedOffTickets": -3,
"playedOffRevenue": -87,
"Transactions.deliveryMethod": "",
"soldTickets": 0,
"soldRevenue": 0,
}];
但是我得到的响应不是我想要的。我究竟做错了什么?提前致谢!
const productMap = {
soldTickets: 0,
soldRevenue: 0,
playedOffTickets: 0,
playedOffRevenue: 0,
};
const arr1 = [];
const arr2 = [
{
"Transactions.deliveryMethod": "Print At Home Delivery",
"Transactions.itemCount": "60",
"Transactions.revenue": "1730.5"
},
{
"Transactions.deliveryMethod": "Postal Delivery",
"Transactions.itemCount": "43",
"Transactions.revenue": "1160"
},
{
"Transactions.deliveryMethod": "Cobo Delivery",
"Transactions.itemCount": "12",
"Transactions.revenue": "348"
},
{
"Transactions.deliveryMethod": "",
"Transactions.itemCount": "-3",
"Transactions.revenue": "-87"
}
];
arr1.reduce((p, salesData) => {
const product = salesData["Transactions.deliveryMethod"];
p[product] = p[product] || {};
const soldTickets = Number(salesData["Transactions.itemCount"]);
const soldRevenue = Number(salesData["Transactions.revenue"]);
p[product].soldTickets = p[product].soldTickets || 0;
p[product].soldTickets += soldTickets;
p[product].soldRevenue = p[product].soldRevenue || 0;
p[product].soldRevenue += soldRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
arr2.reduce((p, playedOffData) => {
const product = playedOffData["Transactions.deliveryMethod"];
p[product] = p[product] || {};
const playedOffTickets = Number(playedOffData["Transactions.itemCount"]);
const playedOffRevenue = Number(playedOffData["Transactions.revenue"]);
p[product].playedOffTickets = p[product].playedOffTickets || 0;
p[product].playedOffTickets += playedOffTickets;
p[product].playedOffRevenue = p[product].playedOffRevenue || 0;
p[product].playedOffRevenue += playedOffRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
const productMapData = Object.values(productMap);
console.log(productMapData)
我建议添加一个 productMapDefaults
对象,只要我们想在 productMap 对象中创建一个新条目,我们就会使用它。
然后可以根据需要自定义以添加新属性。
const productMap = {};
const productMapDefaults = {
soldTickets: 0,
soldRevenue: 0,
playedOffTickets: 0,
playedOffRevenue: 0
}
const arr1 = [];
const arr2 = [
{
"Transactions.deliveryMethod": "Print At Home Delivery",
"Transactions.itemCount": "60",
"Transactions.revenue": "1730.5"
},
{
"Transactions.deliveryMethod": "Postal Delivery",
"Transactions.itemCount": "43",
"Transactions.revenue": "1160"
},
{
"Transactions.deliveryMethod": "Cobo Delivery",
"Transactions.itemCount": "12",
"Transactions.revenue": "348"
},
{
"Transactions.deliveryMethod": "",
"Transactions.itemCount": "-3",
"Transactions.revenue": "-87"
}
];
arr1.reduce((p, salesData) => {
const product = salesData["Transactions.deliveryMethod"];
// Use productMapDefaults as template when creating new entry...
p[product] = p[product] || { ...productMapDefaults };
const soldTickets = Number(salesData["Transactions.itemCount"]);
const soldRevenue = Number(salesData["Transactions.revenue"]);
p[product].soldTickets = p[product].soldTickets || 0;
p[product].soldTickets += soldTickets;
p[product].soldRevenue = p[product].soldRevenue || 0;
p[product].soldRevenue += soldRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
arr2.reduce((p, playedOffData) => {
const product = playedOffData["Transactions.deliveryMethod"];
// Use productMapDefaults as template when creating new entry...
p[product] = p[product] || { ...productMapDefaults };
const playedOffTickets = Number(playedOffData["Transactions.itemCount"]);
const playedOffRevenue = Number(playedOffData["Transactions.revenue"]);
p[product].playedOffTickets = p[product].playedOffTickets || 0;
p[product].playedOffTickets += playedOffTickets;
p[product].playedOffRevenue = p[product].playedOffRevenue || 0;
p[product].playedOffRevenue += playedOffRevenue;
p[product]["Transactions.deliveryMethod"] = product;
return p;
}, productMap);
const productMapData = Object.values(productMap);
console.log(productMapData)
.as-console-wrapper { max-height: 100% !important; top: 0; }