如何在JavaScript中对嵌套数组对象的各子组特定属性值求和并更新原数组?
解决分组属性求和并更新原数组的问题
你的代码返回NaN是因为Object.entries(details[0])返回的是键值对数组,每一项格式为[分组键, 该分组对应的对象数组](比如["1345", [ {...} ]])。你尝试访问curr["fare"]时,curr是这个键值对数组,自然找不到fare属性,结果为undefined,和数字相加后就变成了NaN。
下面根据你的需求(以及预期输出)给出几种针对性的实现方案:
方案1:匹配你的预期输出(totalCost取分组总和,totalFee取自身值)
根据你给出的预期结果,totalCost是分组内所有对象的fare+tax总和,totalFee是每个对象自身的com+agency之和,代码实现如下:
var details = [{ 1345:[ {route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}], 2353: [ {route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0}, {route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0} ] }]; // 遍历details第一个对象的所有分组 for (const [_, items] of Object.entries(details[0])) { // 计算当前分组的totalCost总和(所有对象的fare+tax相加) const groupTotalCost = items.reduce((sum, item) => sum + item.fare + item.tax, 0); // 更新分组内每个对象的字段 items.forEach(item => { item.totalCost = groupTotalCost; item.totalFee = item.com + item.agency; }); } console.log(details);
运行后结果完全匹配你的预期:
- 1345组对象:
totalCost: 91, totalFee: 69 - 2353组第一个对象:
totalCost: 188, totalFee: 86(注:你预期里写的90是笔误,34+52实际为86) - 2353组第二个对象:
totalCost: 188, totalFee: 90
方案2:每个对象自身计算(totalCost=自身fare+tax,totalFee=自身com+agency)
如果你的需求是每个对象独立计算对应字段(和你备注的公式一致),可以直接遍历每个对象更新:
var details = [{ 1345:[ {route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}], 2353: [ {route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0}, {route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0} ] }]; for (const [_, items] of Object.entries(details[0])) { items.forEach(item => { item.totalCost = item.fare + item.tax; item.totalFee = item.com + item.agency; }); } console.log(details);
方案3:分组总和填充到所有对象
如果需要把分组的fare+tax总和、com+agency总和分别填充到该分组下的所有对象中,代码如下:
var details = [{ 1345:[ {route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}], 2353: [ {route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0}, {route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0} ] }]; for (const [_, items] of Object.entries(details[0])) { const groupTotalCost = items.reduce((sum, item) => sum + item.fare + item.tax, 0); const groupTotalFee = items.reduce((sum, item) => sum + item.com + item.agency, 0); items.forEach(item => { item.totalCost = groupTotalCost; item.totalFee = groupTotalFee; }); } console.log(details);
内容的提问来源于stack exchange,提问作者hans1125
相关产品推荐
相关产品推荐

