我正在从API返回JSON数据。然后我使用map创建自己的对象。
数据有多个对象。这是一个例子:
{
"data": {
"job": [
{
"jobNumber": "1",
"jobTasks": {
"jobTask": [
{
"total": { "amountString": "10.00" }
},
{
"total": { "amountString": "10.00" }
}
]
}
},
{
"jobNumber": "2",
"jobTasks": {
"jobTask": [
{
"total": { "amountString": "20.00" }
},
{
"total": { "amountString": "20.00" }
}
]
}
},
{
"jobNumber": "3",
"jobTasks": {
"jobTask": [
{
"total": { "amountString": "30.00" }
},
{
"total": { "amountString": "30.00" }
}
]
}
}
]
}
}
从返回的示例开始,我希望得到以下内容:
jobNumber:1:总计20。 jobNumber:2:总计40。 jobNumber:3:总计60。
以下是我正在使用的代码:
var array = response.data.map(function(item, array) {
var sumTaskTotal = item.jobTasks.reduce(function(sumTaskTotal, item, index) {
if (item !== null && item.total !== null) {
sumTaskTotal += item.total.amountString;
return sumTaskTotal;
}
}, 0);
array = response.data.map(item => ({
jobNumber: item.jobNumber,
sumTaskTotal: sumTaskTotal,
}));
}
然而,我使用的总和只是总结,所以我最终得到:
jobNumber:1:总计120. jobNumber:120:总计120. jobNumber:3:总计120。
我试过循环,但这似乎没有让我到处。
答案 0 :(得分:1)
实际上并不确定你是如何得到jobNumber: 1: Total 120. jobNumber: 120: Total 120. jobNumber: 3: Total 120.
的。我尝试了你的代码,当你记录数组时,你只得到一个array with 3 undefined items
;代码中map
中的每次迭代都不会返回任何数组包含3个未定义项的原因。
此外,data
和jobTasks
是对象。您应该在map
和reduce
属性上使用job
或jobTask
。
至于添加总计,amountString
是string
(显然),您应该先将其转换为数字。否则,第一次迭代的结果将是010.00
,因为您要将string
连接到number
。它没有添加0
和10.00
。
外部地图中的array = response.data.map...
部分将再次完成所有作业。 map
中的每次迭代都需要返回一个项目。如果您没有返回任何内容,undefined
将是该数组的值。因此,不是再次映射数组,而是可以这样做:
return {
jobNumber: item.jobNumber,
sumTaskTotal,
};
然后会产生一个包含3个对象的数组:
[{
jobNumber: '1',
sumTaskTotal: 20,
}, {
jobNumber: '2',
sumTaskTotal: 40,
}, {
jobNumber: '3',
sumTaskTotal: 60,
}]
但是,您可以改为nested reduce
:
const formatted = response.data.job.reduce((prevString, currentJob) => {
const total = currentJob.jobTasks.jobTask.reduce((prevTotal, currentJobTask) => {
return prevTotal + Number(currentJobTask.total.amountString);
}, 0);
return `${prevString}jobNumber: ${currentJob.jobNumber}: Total ${total}. `;
}, '');
const response = {
"data": {
"job": [{
"jobNumber": "1",
"jobTasks": {
"jobTask": [{
"total": {
"amountString": "10.00"
}
}, {
"total": {
"amountString": "10.00"
}
}]
}
}, {
"jobNumber": "2",
"jobTasks": {
"jobTask": [{
"total": {
"amountString": "20.00"
}
}, {
"total": {
"amountString": "20.00"
}
}]
}
}, {
"jobNumber": "3",
"jobTasks": {
"jobTask": [{
"total": {
"amountString": "30.00"
}
}, {
"total": {
"amountString": "30.00"
}
}]
}
}]
}
};
const formatted = response.data.job.reduce((prevString, currentJob) => {
const total = currentJob.jobTasks.jobTask.reduce((prevTotal, currentJobTask) => {
return prevTotal + Number(currentJobTask.total.amountString);
}, 0);
return `${prevString}jobNumber: ${currentJob.jobNumber}: Total ${total}. `;
}, '');
console.log(formatted.trim());
答案 1 :(得分:0)
您只需使用forEach
即可获得所需的字符串。
const data = {
"data": {
"job": [
--
]
}
}
let string = "";
data.data.job.forEach((item) => {
const sum = item.jobTasks.jobTask.reduce((total, i) => parseFloat(i.total.amountString) + total, 0);
string += `jobNumber: ${item.jobNumber}: Total ${sum}. `;
});
console.log(string);
你的字符串后面会有一个不必要的空格。必要时使用修剪功能。