【问题标题】:How to call reduce over empty array and assign new properties如何在空数组上调用reduce并分配新属性
【发布时间】:2022-01-14 12:01:30
【问题描述】:

我有一个具有默认属性的对象和两个数组,其中一个是空的。 空数组在某些情况下可能不为空,但我仍然想循环它。如果数组为空,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)

【问题讨论】:

  • 由于性别,您正在设置未定义的属性。你想要完成什么?你能添加你想要得到的预期结果吗?

标签: javascript arrays ecmascript-6 reduce


【解决方案1】:

我建议添加一个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; }

【讨论】:

    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2020-10-23
    • 2017-07-04
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多