【发布时间】: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