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

如何对相同category的size数值求和并传递给组件?

解决同Category的Size总和计算问题

我来帮你搞定这个计算同类别size总和并传给组件的需求~先看看你原代码里的问题:每次循环都把size重置为0,而且只加当前项的size,根本没法实现同类别size的累加,另外lastCategory也没初始化,容易出现逻辑bug。

咱们换个思路,先预先计算好每个category的size总和,再遍历数据渲染组件,这样逻辑更清晰也更高效:

步骤1:计算每个分类的总Size

用reduce方法遍历数据,把每个category的size累加起来,存在一个对象里,键是category名称,值是对应总和:

const categorySizeSum = data.reduce((acc, item) => {
  // 如果当前分类还没在累加对象里,初始化为0,再加上当前项的size
  acc[item.category] = (acc[item.category] || 0) + item.size;
  return acc;
}, {});

执行完这段代码后,categorySizeSum会是这样的对象:

{
  "Keswick": 1180160,
  "HCOPA": 1090048,
  "Darhan Saluja": 493056,
  "CRSA": 267776,
  "Arundel": 401920
}

步骤2:遍历数据渲染组件

现在咱们可以安心遍历原数据,遇到新的category时,直接从categorySizeSum里取对应的总和传给ProductCategoryRow就好:

let rows = [];
let lastCategory = null; // 初始化lastCategory,避免首次判断出错

data.forEach((product, index) => {
  if (product.category !== lastCategory) {
    rows.push(<ProductCategoryRow 
      size={categorySizeSum[product.category]} 
      category={product.category} 
      key={product.category}
    />);
  }
  // 注意:原代码里用product.name当key,但你的数据里没有name字段,换成product.index更稳妥
  rows.push(<ProductRow 
    product={product} 
    key={product.index} 
    index={index}
  />);
  lastCategory = product.category;
});

完整代码整合

把上面的步骤整合起来就是完整的解决方案:

let data = [ 
  {size: 1180160, category: "Keswick", index: 1}, 
  {size: 1059328, category: "HCOPA", index: 2}, 
  {size: 30720, category: "HCOPA", index: 3}, 
  {size: 493056, category: "Darhan Saluja", index: 4}, 
  {size: 267776, category: "CRSA", index: 5}, 
  {size: 328704, category: "Arundel", index: 6}, 
  {size: 73216, category: "Arundel", index: 7} 
];

// 计算每个分类的总size
const categorySizeSum = data.reduce((acc, item) => {
  acc[item.category] = (acc[item.category] || 0) + item.size;
  return acc;
}, {});

let rows = [];
let lastCategory = null;

// 生成组件列表
data.forEach((product, index) => {
  if (product.category !== lastCategory) {
    rows.push(<ProductCategoryRow 
      size={categorySizeSum[product.category]} 
      category={product.category} 
      key={product.category}
    />);
  }
  rows.push(<ProductRow 
    product={product} 
    key={product.index} 
    index={index}
  />);
  lastCategory = product.category;
});

这个方案的好处是只需要遍历数据两次(一次计算总和,一次渲染),逻辑清晰,不会出现原代码里的累加错误,而且key的使用也更合理。

内容的提问来源于stack exchange,提问作者Amir Mursal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:13