You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:57:39