Javascript 使用reduce遍历JSON
我正在使用一个reduce函数,它循环遍历我的JSON文件,并将我指定的键值相加 这很好,直到我删除其中一个值 我的JSON是:Javascript 使用reduce遍历JSON,javascript,arrays,json,object,mapreduce,Javascript,Arrays,Json,Object,Mapreduce,我正在使用一个reduce函数,它循环遍历我的JSON文件,并将我指定的键值相加 这很好,直到我删除其中一个值 我的JSON是: [{ "id": 100, "jobNumber": 1, "jobTasks": [{ "id": 12, "cost": { "amountString": 100 }
[{
"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
reduce是否需要多个或相同数量的值对才能工作?我尝试了各种for循环,但没有成功。您需要检查第二个对象的
未定义的值,该对象没有属性amountString
。如果对象中不存在属性amountString
,则返回值0
因此,将return
语句从
返回和+elem.cost.amountString代码>
至
返回和+(elem.cost&&elem.cost.amountString?elem.cost.amountString:0)代码>
完整代码:
var json={};
json.data=[{
“id”:100,
“工作编号”:1,
“工作任务”:[{
“id”:12,
“成本”:{
“amountString”:100
}
},
{
“id”:13,
“成本”:{
“amountString”:500
}
}
]
},
{
“id”:101,
“工作编号”:2,
“工作任务”:[{
“id”:14,
“成本”:{
“amountString”:100
}
},
{
“身份证”:15
}
]
}
]
json.data.forEach(函数(项){
var sum=item.jobstasks.reduce(函数(sum,elem){
返回和+(elem.cost&&elem.cost.amountString?elem.cost.amountString:0);
}, 0);
console.log('jobNumber'+item.jobNumber+''+总和);
});代码>
TypeError:无法读取未定义的属性“amountString”
发生这种情况是因为您正在尝试取消引用未定义的值。您实际上是在编写return sum+undefined.amountString
,这类似于编写return sum+null.amountString
。你怎么避开这个
除了Agalo建议的之外,我们还可以筛选具有成本的jobTask对象:
json.data.forEach(function(item) {
var sum = item.jobTasks
.filter(function (j) { return j.cost; })
.reduce(function(sum, elem) {
return sum + elem.cost.amountString;
}, 0);
console.log('jobNumber' + item.jobNumber + ' ' + sum);
});
作为旁白,考虑使用箭头语法,因为它可以说是更可读的。
json.data.forEach((item) => {
var sum = item.jobTasks
.filter((j) => j.cost)
.reduce((sum, elem) => sum + elem.cost.amountString, 0);
console.log('jobNumber' + item.jobNumber + ' ' + sum);
});
完整的代码列表:
var json={};
json.data=[{
“id”:100,
“工作编号”:1,
“工作任务”:[{
“id”:12,
“成本”:{
“amountString”:100
}
},
{
“id”:13,
“成本”:{
“amountString”:500
}
}
]
},
{
“id”:101,
“工作编号”:2,
“工作任务”:[{
“id”:14,
“成本”:{
“amountString”:100
}
},
{
“身份证”:15
}
]
}
];
//具有传统功能
json.data.forEach(函数(项){
var sum=item.jobstasks
.过滤器(功能(j){
返回j.成本;
})
.reduce(函数(和,元素){
返回和+elem.cost.amountString;
}, 0);
console.log('jobNumber'+item.jobNumber+''+总和);
});
//具有箭头功能
json.data.forEach((项)=>{
var sum=item.jobstasks
.过滤器((j)=>j.成本)
.reduce((总和,元素)=>sum+elem.cost.amountString,0);
console.log('jobNumber'+item.jobNumber+''+总和);
});代码>谢谢这也有帮助!谢谢这真的很有帮助!我是个傻瓜,以前没想过用“?”这个词。很高兴,它有用:)