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

10-11 17:56