【问题标题】:JavaScript reduce function issuesJavaScript减少功能问题
【发布时间】:2017-07-29 03:30:06
【问题描述】:

我正在使用返回 JSON 对象的 JavaScript (Es6) 调用 API。

首先,我在这里返回的 JSON 示例:https://pastebin.com/PrLc2pFD

一旦我得到了上面返回的 JSON,我就可以使用 map 函数来创建一个名为 array 的新对象。我正在使用 reduce 来汇总一些嵌套和重复的项目。

以下是我的代码片段:

var array = response.data.map(function(item, array) {


            var sumTaskTotal = item.jobTasks.reduce(function(sumTaskTotal, elem) {
                if (elem !== null && elem.sumTaskTotal !== null) {
                    return +(elem.total && elem.total.amountString ? elem.total.amountString : 0);
                }
            }, 0);

            var sumCostBillable = item.jobTasks.reduce(function(sumCostBillable, elem) {
                if (elem !== null && elem.totalCostBillable !== null) {
                    return +(elem.totalCostBillable && elem.totalCostBillable.amountString ? elem.totalCostBillable.amountString : 0);
                }
            }, 0);

            var sumThirdPartyCost = item.jobThirdPartyCosts.reduce(function(sumThirdPartyCost, elem) {
                if (elem !== null && elem.total !== null) {
                    return +(elem.cost && elem.cost.amountString ? elem.cost.amountString : 0);
                }
            }, 0);

            var sumInvoices = item.invoices.reduce(function(sumInvoices, elem) {
                if (elem !== null && elem.invoice !== null) {
                    return +(elem.invoicedNet && elem.invoicedNet.amountString ? elem.invoicedNet.amountString : 0);
                }
            }, 0);

    array = response.data.map(item => ({
      id: item.id,
      jobNumber: item.jobNumber,
      jobStateType: item.jobStateType,
      jobBillingStateType: item.jobBillingStateType,
      startDate: dateformat(item.jobStartDate, "yyyy-mm-dd"),
      internalDeadline: dateformat(item.internalDeadline, "yyyy-mm-dd"),
      potentialValue: item.potentialValue.amountString,
      estimatedValue: item.estimatedSellValue.amountString,
      billedNet: sumInvoices,
      sumTaskTotal: sumTaskTotal,
      sumCostBillable: sumCostBillable,
      sumThirdPartyCost: sumThirdPartyCost,
      jobDetailId: item.jobDetailId
    }));

以下 reduce 函数可以正常工作: sumTaskTotal、sumCostBillable、sumThirdPartyCost

他们正在做的是检查字段是否存在,如果存在,则进行归约和求和。如果不是,则设置为 0。

不起作用的是: sumInvoices

我不太明白为什么,我没有收到任何错误,我总是返回 '0',根据下面的 console.log(array)

{ id: 2352162,
jobNumber: '2015T1151',
jobStateType: 'PROGRESS',
jobBillingStateType: 'NOT_BILLED',
startDate: '2017-07-26',
internalDeadline: '2017-07-24',
potentialValue: 190,
estimatedValue: 9500,
billedNet: 0,
sumTaskTotal: 9500,
sumCostBillable: 75,
sumThirdPartyCost: 11,
jobDetailId: 2679930 }

【问题讨论】:

  • if 测试为false 时,您的代码不会返回任何内容。 .reduce() 回调必须始终返回目标值。
  • "如果是,则归约和求和" - 你的归约函数都不做任何求和。它们要么返回当前项目的amountString,要么返回 0,或者(如 Pointy 所说)未定义。 (因此每个reduce的最终结果将完全基于数组中的最后一项。)

标签: javascript json sorting object reduce


【解决方案1】:
var sumInvoices = item.invoices.reduce(function(sumInvoices, elem) {
            if (elem !== null && elem.invoice !== null) {
                return +(elem.invoicedNet && elem.invoicedNet.amountString ? elem.invoicedNet.amountString : 0);
            }
            return sumInvoices;  // <--------------------add this
        }, 0);

正如 Pointy 评论的那样,您需要添加一个 return 语句。为避免任何其他问题,您还应该在使用的每个 reduce 中添加 areturn 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 2020-11-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2020-07-20
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多