如何在空数组上调用 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; }