Javascript 使用reduce遍历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 }

我正在使用一个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

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+''+总和);

});谢谢这也有帮助!谢谢这真的很有帮助!我是个傻瓜,以前没想过用“?”这个词。很高兴,它有用:)