我正在使用一个reduce函数,该函数循环遍历我的JSON文件,并将我指定的键值加在一起。
在我删除其中一个值之前,它可以正常工作。
我的JSON是:
[{
"id": 100,
"jobNumber": 1,
"jobTasks": [{
"id": 12,
"cost": {
"amountString": 100
}
},
{
"id": 13,
"cost": {
"amountString": 500
}
}
]
},
{
"id": 101,
"jobNumber": 2,
"jobTasks": [{
"id": 14,
"cost": {
"amountString": 100
}
},
{
"id": 15
}
]
}
]
我正在使用的reduce函数是:
json.data.forEach(function(item) {
var sum = item.jobTasks.reduce(function(sum, elem) {
return sum + elem.cost.amountString;
}, 0);
console.log('jobNumber' + item.jobNumber + ' ' + sum);
});
我正在努力实现这一目标:
jobNumber1 600
jobNumber2 100
如果在第二个作业中放置另一个cost.amountString,这将很好地工作,但是如上面的JSON所示,在第一个作业中放置了两个,在第二个作业中放置了一个,第二个作业中,我得到以下错误:
TypeError: Cannot read property 'amountString' of undefined
减少是否需要多个或相同数量的值对才能工作?我尝试了各种for循环,但均未成功。
最佳答案
您需要检查第二个不具有属性undefined
的对象的amountString
值。如果对象中不存在属性amountString
,则返回值0
。
因此,将return
语句更改为return sum + elem.cost.amountString;
至return sum + (elem.cost && elem.cost.amountString ? elem.cost.amountString : 0) ;
完整的代码:
var json = {};
json.data = [{
"id": 100,
"jobNumber": 1,
"jobTasks": [{
"id": 12,
"cost": {
"amountString": 100
}
},
{
"id": 13,
"cost": {
"amountString": 500
}
}
]
},
{
"id": 101,
"jobNumber": 2,
"jobTasks": [{
"id": 14,
"cost": {
"amountString": 100
}
},
{
"id": 15
}
]
}
]
json.data.forEach(function(item) {
var sum = item.jobTasks.reduce(function(sum, elem) {
return sum + (elem.cost && elem.cost.amountString ? elem.cost.amountString : 0) ;
}, 0);
console.log('jobNumber' + item.jobNumber + ' ' + sum);
});
关于javascript - 使用reduce循环遍历JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43765929/