对数组中的数据进行分组,求和并添加子节点

group data from an array, making sum and add child node

我正在尝试总结一个 JSON,我尝试了 Stack Overflow 中的几个示例 How to make a foreach of an object in javascript? 但是 none 次尝试成功了。

   Sale: [
  {
     saleID: "2",
     timeStamp: "2021-01-08T17:50:28+00:00",
     discountPercent: "0",
     completed: "true",
     archived: "false",
     voided: "false",
     enablePromotions: "true",
     isTaxInclusive: "true",
     createTime: "2021-01-08T17:49:53+00:00",
     updateTime: "2021-01-08T17:50:29+00:00",
     completeTime: "2021-01-08T17:50:28+00:00",
     referenceNumber: "",
     referenceNumberSource: "",
     tax1Rate: "0.2",
     tax2Rate: "0",
     change: "0",
     receiptPreference: "printed",
     displayableSubtotal: "500",
     ticketNumber: "220000000002",
     calcDiscount: "0",
     calcTotal: "500",
     calcSubtotal: "416.67",
     calcTaxable: "416.67",
     calcNonTaxable: "0",
     calcAvgCost: "0",
     calcFIFOCost: "0",
     calcTax1: "83.33",
     calcTax2: "0",
     calcPayments: "500",
     total: "500",
     totalDue: "500",
     displayableTotal: "500",
     balance: "0",
     customerID: "0",
     discountID: "0",
     employeeID: "1",
     quoteID: "0",
     registerID: "1",
     shipToID: "0",
     shopID: "1",
     taxCategoryID: "1",
     taxTotal: "83.33"
  },
  {
     saleID: "3",
     timeStamp: "2021-01-08T17:53:18+00:00",
     discountPercent: "0",
     completed: "false",
     archived: "false",
     voided: "false",
     enablePromotions: "true",
     isTaxInclusive: "true",
     createTime: "2021-01-08T17:53:18+00:00",
     updateTime: "2021-01-08T17:53:18+00:00",
     referenceNumber: "",
     referenceNumberSource: "",
     tax1Rate: "0.2",
     tax2Rate: "0",
     change: "0",
     receiptPreference: "printed",
     displayableSubtotal: "0",
     ticketNumber: "220000000003",
     calcDiscount: "0",
     calcTotal: "0",
     calcSubtotal: "0",
     calcTaxable: "0",
     calcNonTaxable: "0",
     calcAvgCost: "0",
     calcFIFOCost: "0",
     calcTax1: "0",
     calcTax2: "0",
     calcPayments: "0",
     total: "0",
     totalDue: "0",
     displayableTotal: "0",
     balance: "0",
     customerID: "0",
     discountID: "0",
     employeeID: "1",
     quoteID: "0",
     registerID: "1",
     shipToID: "0",
     shopID: "1",
     taxCategoryID: "1",
     taxTotal: "0"
  },
  {
     saleID: "5",
     timeStamp: "2021-01-08T17:54:43+00:00",
     discountPercent: "0",
     completed: "false",
     archived: "false",
     voided: "false",
     enablePromotions: "true",
     isTaxInclusive: "true",
     createTime: "2021-01-08T17:54:43+00:00",
     updateTime: "2021-01-08T17:54:43+00:00",
     referenceNumber: "",
     referenceNumberSource: "",
     tax1Rate: "0.2",
     tax2Rate: "0",
     change: "0",
     receiptPreference: "printed",
     displayableSubtotal: "0",
     ticketNumber: "220000000005",
     calcDiscount: "0",
     calcTotal: "0",
     calcSubtotal: "0",
     calcTaxable: "0",
     calcNonTaxable: "0",
     calcAvgCost: "0",
     calcFIFOCost: "0",
     calcTax1: "0",
     calcTax2: "0",
     calcPayments: "0",
     total: "0",
     totalDue: "0",
     displayableTotal: "0",
     balance: "0",
     customerID: "0",
     discountID: "0",
     employeeID: "1",
     quoteID: "0",
     registerID: "1",
     shipToID: "0",
     shopID: "1",
     taxCategoryID: "1",
     taxTotal: "0"
  },
  {
     saleID: "6",
     timeStamp: "2021-01-24T18:49:27+00:00",
     discountPercent: "0",
     completed: "true",
     archived: "false",
     voided: "false",
     enablePromotions: "true",
     isTaxInclusive: "true",
     createTime: "2021-01-24T18:48:30+00:00",
     updateTime: "2021-01-24T18:49:28+00:00",
     completeTime: "2021-01-24T18:49:27+00:00",
     referenceNumber: "",
     referenceNumberSource: "",
     tax1Rate: "0.2",
     tax2Rate: "0",
     change: "0",
     receiptPreference: "printed",
     displayableSubtotal: "316.69",
     ticketNumber: "220000000006",
     calcDiscount: "0",
     calcTotal: "316.69",
     calcSubtotal: "263.91",
     calcTaxable: "263.91",
     calcNonTaxable: "0",
     calcAvgCost: "0",
     calcFIFOCost: "0",
     calcTax1: "52.78",
     calcTax2: "0",
     calcPayments: "316.69",
     total: "316.69",
     totalDue: "316.69",
     displayableTotal: "316.69",
     balance: "0",
     customerID: "0",
     discountID: "0",
     employeeID: "1",
     quoteID: "0",
     registerID: "1",
     shipToID: "0",
     shopID: "1",
     taxCategoryID: "1",
     taxTotal: "52.78"
  }]

我尝试了几种方法,最新的一种:

      const debitSummary = sales.reduce((acc, inv, i) => {
   // console.log("inside reduce");
    if (i) {
      //  if (parseFloat(inv.calcTotal>0)){ // invoice
      acc = {
        //...acc,
        ticketNumber: acc.ticketNumber + ',' + inv.ticketNumber,
        registerID: inv.registerID > acc.registerID ? inv.registerID : acc.registerID,
        calcTotal: parseFloat(acc.calcTotal) + parseFloat(inv.calcTotal),
        timeStamp: formatDate(inv.timeStamp) > formatDate(acc.timeStamp) ? formatDate(inv.timeStamp) : formatDate(acc.timeStamp),
      }
      // }
    }
    return acc;
  },sales[0] );

但无法实现目标:

[{
    calcTotal: "500",
    registerID: "1",
    saleID: {
      "2",
      "3",
      "5"
    },
    ticketNumber: {
      "220000000002",
      "220000000003",
      "220000000005"
    },
    timeStamp: "2021-01-08",
    total: "500"
  },
  {
    calcTotal: "316.69",
    registerID: "1",
    saleID: "6",
    ticketNumber: {
      "220000000006"
    },
    timeStamp: "2021-01-24",
    total: "316.69"
  }
]

您可以将时间戳中包含日期部分的对象作为键,并从该对象中获取值作为结果。

const
    sale = [{ saleID: "2", timeStamp: "2021-01-08T17:50:28+00:00", discountPercent: "0", completed: "true", archived: "false", voided: "false", enablePromotions: "true", isTaxInclusive: "true", createTime: "2021-01-08T17:49:53+00:00", updateTime: "2021-01-08T17:50:29+00:00", completeTime: "2021-01-08T17:50:28+00:00", referenceNumber: "", referenceNumberSource: "", tax1Rate: "0.2", tax2Rate: "0", change: "0", receiptPreference: "printed", displayableSubtotal: "500", ticketNumber: "220000000002", calcDiscount: "0", calcTotal: "500", calcSubtotal: "416.67", calcTaxable: "416.67", calcNonTaxable: "0", calcAvgCost: "0", calcFIFOCost: "0", calcTax1: "83.33", calcTax2: "0", calcPayments: "500", total: "500", totalDue: "500", displayableTotal: "500", balance: "0", customerID: "0", discountID: "0", employeeID: "1", quoteID: "0", registerID: "1", shipToID: "0", shopID: "1", taxCategoryID: "1", taxTotal: "83.33" }, { saleID: "3", timeStamp: "2021-01-08T17:53:18+00:00", discountPercent: "0", completed: "false", archived: "false", voided: "false", enablePromotions: "true", isTaxInclusive: "true", createTime: "2021-01-08T17:53:18+00:00", updateTime: "2021-01-08T17:53:18+00:00", referenceNumber: "", referenceNumberSource: "", tax1Rate: "0.2", tax2Rate: "0", change: "0", receiptPreference: "printed", displayableSubtotal: "0", ticketNumber: "220000000003", calcDiscount: "0", calcTotal: "0", calcSubtotal: "0", calcTaxable: "0", calcNonTaxable: "0", calcAvgCost: "0", calcFIFOCost: "0", calcTax1: "0", calcTax2: "0", calcPayments: "0", total: "0", totalDue: "0", displayableTotal: "0", balance: "0", customerID: "0", discountID: "0", employeeID: "1", quoteID: "0", registerID: "1", shipToID: "0", shopID: "1", taxCategoryID: "1", taxTotal: "0" }, { saleID: "5", timeStamp: "2021-01-08T17:54:43+00:00", discountPercent: "0", completed: "false", archived: "false", voided: "false", enablePromotions: "true", isTaxInclusive: "true", createTime: "2021-01-08T17:54:43+00:00", updateTime: "2021-01-08T17:54:43+00:00", referenceNumber: "", referenceNumberSource: "", tax1Rate: "0.2", tax2Rate: "0", change: "0", receiptPreference: "printed", displayableSubtotal: "0", ticketNumber: "220000000005", calcDiscount: "0", calcTotal: "0", calcSubtotal: "0", calcTaxable: "0", calcNonTaxable: "0", calcAvgCost: "0", calcFIFOCost: "0", calcTax1: "0", calcTax2: "0", calcPayments: "0", total: "0", totalDue: "0", displayableTotal: "0", balance: "0", customerID: "0", discountID: "0", employeeID: "1", quoteID: "0", registerID: "1", shipToID: "0", shopID: "1", taxCategoryID: "1", taxTotal: "0" }, { saleID: "6", timeStamp: "2021-01-24T18:49:27+00:00", discountPercent: "0", completed: "true", archived: "false", voided: "false", enablePromotions: "true", isTaxInclusive: "true", createTime: "2021-01-24T18:48:30+00:00", updateTime: "2021-01-24T18:49:28+00:00", completeTime: "2021-01-24T18:49:27+00:00", referenceNumber: "", referenceNumberSource: "", tax1Rate: "0.2", tax2Rate: "0", change: "0", receiptPreference: "printed", displayableSubtotal: "316.69", ticketNumber: "220000000006", calcDiscount: "0", calcTotal: "316.69", calcSubtotal: "263.91", calcTaxable: "263.91", calcNonTaxable: "0", calcAvgCost: "0", calcFIFOCost: "0", calcTax1: "52.78", calcTax2: "0", calcPayments: "316.69", total: "316.69", totalDue: "316.69", displayableTotal: "316.69", balance: "0", customerID: "0", discountID: "0", employeeID: "1", quoteID: "0", registerID: "1", shipToID: "0", shopID: "1", taxCategoryID: "1", taxTotal: "52.78" }],
    result = Object.values(sale.reduce((r, o) => {
        const timeStamp = o.timeStamp.slice(0, 10);
        r[timeStamp] ??= { timeStamp, registerID: o.registerID, ticketNumber: [], saleID: [], calcTotal: 0, total: 0 };
        ['calcTotal', 'total'].forEach(k => r[timeStamp][k] += +o[k]);
        ['saleID', 'ticketNumber'].forEach(k => r[timeStamp][k].push(o[k]));
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

j = [
    {
       saleID: "2",
       timeStamp: "2021-01-08T17:50:28+00:00",
       discountPercent: "0",
       completed: "true",
       archived: "false",
       voided: "false",
       enablePromotions: "true",
       isTaxInclusive: "true",
       createTime: "2021-01-08T17:49:53+00:00",
       updateTime: "2021-01-08T17:50:29+00:00",
       completeTime: "2021-01-08T17:50:28+00:00",
       referenceNumber: "",
       referenceNumberSource: "",
       tax1Rate: "0.2",
       tax2Rate: "0",
       change: "0",
       receiptPreference: "printed",
       displayableSubtotal: "500",
       ticketNumber: "220000000002",
       calcDiscount: "0",
       calcTotal: "500",
       calcSubtotal: "416.67",
       calcTaxable: "416.67",
       calcNonTaxable: "0",
       calcAvgCost: "0",
       calcFIFOCost: "0",
       calcTax1: "83.33",
       calcTax2: "0",
       calcPayments: "500",
       total: "500",
       totalDue: "500",
       displayableTotal: "500",
       balance: "0",
       customerID: "0",
       discountID: "0",
       employeeID: "1",
       quoteID: "0",
       registerID: "1",
       shipToID: "0",
       shopID: "1",
       taxCategoryID: "1",
       taxTotal: "83.33"
    },
    {
       saleID: "3",
       timeStamp: "2021-01-08T17:53:18+00:00",
       discountPercent: "0",
       completed: "false",
       archived: "false",
       voided: "false",
       enablePromotions: "true",
       isTaxInclusive: "true",
       createTime: "2021-01-08T17:53:18+00:00",
       updateTime: "2021-01-08T17:53:18+00:00",
       referenceNumber: "",
       referenceNumberSource: "",
       tax1Rate: "0.2",
       tax2Rate: "0",
       change: "0",
       receiptPreference: "printed",
       displayableSubtotal: "0",
       ticketNumber: "220000000003",
       calcDiscount: "0",
       calcTotal: "0",
       calcSubtotal: "0",
       calcTaxable: "0",
       calcNonTaxable: "0",
       calcAvgCost: "0",
       calcFIFOCost: "0",
       calcTax1: "0",
       calcTax2: "0",
       calcPayments: "0",
       total: "0",
       totalDue: "0",
       displayableTotal: "0",
       balance: "0",
       customerID: "0",
       discountID: "0",
       employeeID: "1",
       quoteID: "0",
       registerID: "1",
       shipToID: "0",
       shopID: "1",
       taxCategoryID: "1",
       taxTotal: "0"
    },
    {
       saleID: "5",
       timeStamp: "2021-01-08T17:54:43+00:00",
       discountPercent: "0",
       completed: "false",
       archived: "false",
       voided: "false",
       enablePromotions: "true",
       isTaxInclusive: "true",
       createTime: "2021-01-08T17:54:43+00:00",
       updateTime: "2021-01-08T17:54:43+00:00",
       referenceNumber: "",
       referenceNumberSource: "",
       tax1Rate: "0.2",
       tax2Rate: "0",
       change: "0",
       receiptPreference: "printed",
       displayableSubtotal: "0",
       ticketNumber: "220000000005",
       calcDiscount: "0",
       calcTotal: "0",
       calcSubtotal: "0",
       calcTaxable: "0",
       calcNonTaxable: "0",
       calcAvgCost: "0",
       calcFIFOCost: "0",
       calcTax1: "0",
       calcTax2: "0",
       calcPayments: "0",
       total: "0",
       totalDue: "0",
       displayableTotal: "0",
       balance: "0",
       customerID: "0",
       discountID: "0",
       employeeID: "1",
       quoteID: "0",
       registerID: "1",
       shipToID: "0",
       shopID: "1",
       taxCategoryID: "1",
       taxTotal: "0"
    },
    {
       saleID: "6",
       timeStamp: "2021-01-24T18:49:27+00:00",
       discountPercent: "0",
       completed: "true",
       archived: "false",
       voided: "false",
       enablePromotions: "true",
       isTaxInclusive: "true",
       createTime: "2021-01-24T18:48:30+00:00",
       updateTime: "2021-01-24T18:49:28+00:00",
       completeTime: "2021-01-24T18:49:27+00:00",
       referenceNumber: "",
       referenceNumberSource: "",
       tax1Rate: "0.2",
       tax2Rate: "0",
       change: "0",
       receiptPreference: "printed",
       displayableSubtotal: "316.69",
       ticketNumber: "220000000006",
       calcDiscount: "0",
       calcTotal: "316.69",
       calcSubtotal: "263.91",
       calcTaxable: "263.91",
       calcNonTaxable: "0",
       calcAvgCost: "0",
       calcFIFOCost: "0",
       calcTax1: "52.78",
       calcTax2: "0",
       calcPayments: "316.69",
       total: "316.69",
       totalDue: "316.69",
       displayableTotal: "316.69",
       balance: "0",
       customerID: "0",
       discountID: "0",
       employeeID: "1",
       quoteID: "0",
       registerID: "1",
       shipToID: "0",
       shopID: "1",
       taxCategoryID: "1",
       taxTotal: "52.78"
    }];
    result = j.reduce((r, { registerID,timeStamp, ...object }) => {
        var temp = r.find(o => o.registerID === registerID && (new Date(o.timeStamp)).toLocaleDateString() === (new Date(timeStamp)).toLocaleDateString());
        if (!temp) r.push(temp = { calcTotal: "0", registerID,timeStamp: (new Date(timeStamp)).toLocaleDateString(), saleID: [], ticketNumber: [], total: "0" });
        temp.saleID.push(object.saleID);
        temp.ticketNumber.push(object.ticketNumber);
        temp.calcTotal = (parseInt(temp.calcTotal) + parseInt(object.calcTotal)).toString();
        temp.total = (parseInt(temp.total) + parseInt(object.total)).toString();

        return r;
    }, []);
    
console.log(result);