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

如何为表格按Item ID添加顶部汇总行:合并配料并汇总成本

问题描述

现有如下表格:

ItemIngredientsCostItem ID
PizzaCheese$.01001
PizzaFlour$.04001
PizzaTomato$.04001
BreadFlour$.04003
CookiesFlour$.07004
SandwichFlour$.04002
SandwichCheese$.01002
SandwichMeat$.10002
SandwichLettuce$.01002

需在保留Item和Item ID不变的前提下,为每个Item创建汇总行(合并Ingredients、汇总总成本),并将汇总行置于对应配料明细行的上方,预期效果如下:

ItemIngredientsCostItem ID
PizzaTomato Cheese Flour$.13001
PizzaCheese$.01001
PizzaFlour$.04001
PizzaTomato$.07001
BreadFlour$.04003
CookiesFlour$.04004
SandwichFlour Cheese Meat Lettuce$.16002
SandwichFlour$.04002
SandwichCheese$.01002
SandwichMeat$.10002
SandwichLettuce$.01002
解决方案

核心思路是先分组统计,再构建新行集合,避免嵌套循环的混乱逻辑,以下是两种常见场景的实现:

前端JavaScript实现

// 模拟从表格读取的原始数据(或接口返回的数组)
const originalRows = [
  { item: 'Pizza', ingredient: 'Cheese', cost: 0.01, itemId: '001' },
  { item: 'Pizza', ingredient: 'Flour', cost: 0.04, itemId: '001' },
  { item: 'Pizza', ingredient: 'Tomato', cost: 0.04, itemId: '001' },
  { item: 'Bread', ingredient: 'Flour', cost: 0.04, itemId: '003' },
  { item: 'Cookies', ingredient: 'Flour', cost: 0.07, itemId: '004' },
  { item: 'Sandwich', ingredient: 'Flour', cost: 0.04, itemId: '002' },
  { item: 'Sandwich', ingredient: 'Cheese', cost: 0.01, itemId: '002' },
  { item: 'Sandwich', ingredient: 'Meat', cost: 0.10, itemId: '002' },
  { item: 'Sandwich', ingredient: 'Lettuce', cost: 0.01, itemId: '002' },
];

// 按Item ID分组统计
const groupedData = originalRows.reduce((acc, row) => {
  const key = row.itemId;
  if (!acc[key]) {
    acc[key] = {
      item: row.item,
      itemId: key,
      ingredients: [],
      totalCost: 0,
      details: []
    };
  }
  acc[key].ingredients.push(row.ingredient);
  acc[key].totalCost += row.cost;
  acc[key].details.push(row);
  return acc;
}, {});

// 构建最终行数组:先添加汇总行,再添加明细行
const finalRows = [];
Object.values(groupedData).forEach(group => {
  // 汇总行
  finalRows.push({
    item: group.item,
    ingredient: group.ingredients.join(' '),
    cost: `$.${group.totalCost.toFixed(2)}`,
    itemId: group.itemId
  });
  // 明细行
  group.details.forEach(detail => {
    finalRows.push({
      item: detail.item,
      ingredient: detail.ingredient,
      cost: `$.${detail.cost.toFixed(2)}`,
      itemId: detail.itemId
    });
  });
});

// 渲染到页面表格
const tableBody = document.querySelector('.s-table tbody');
tableBody.innerHTML = ''; // 清空原有内容
finalRows.forEach(row => {
  const tr = document.createElement('tr');
  tr.innerHTML = `
    <td>${row.item}</td>
    <td>${row.ingredient}</td>
    <td>${row.cost}</td>
    <td>${row.itemId}</td>
  `;
  tableBody.appendChild(tr);
});

后端Python实现

original_rows = [
    {"item": "Pizza", "ingredient": "Cheese", "cost": 0.01, "item_id": "001"},
    {"item": "Pizza", "ingredient": "Flour", "cost": 0.04, "item_id": "001"},
    {"item": "Pizza", "ingredient": "Tomato", "cost": 0.04, "item_id": "001"},
    {"item": "Bread", "ingredient": "Flour", "cost": 0.04, "item_id": "003"},
    {"item": "Cookies", "ingredient": "Flour", "cost": 0.07, "item_id": "004"},
    {"item": "Sandwich", "ingredient": "Flour", "cost": 0.04, "item_id": "002"},
    {"item": "Sandwich", "ingredient": "Cheese", "cost": 0.01, "item_id": "002"},
    {"item": "Sandwich", "ingredient": "Meat", "cost": 0.10, "item_id": "002"},
    {"item": "Sandwich", "ingredient": "Lettuce", "cost": 0.01, "item_id": "002"},
]

# 分组统计
grouped = {}
for row in original_rows:
    key = row["item_id"]
    if key not in grouped:
        grouped[key] = {
            "item": row["item"],
            "item_id": key,
            "ingredients": [],
            "total_cost": 0.0,
            "details": []
        }
    grouped[key]["ingredients"].append(row["ingredient"])
    grouped[key]["total_cost"] += row["cost"]
    grouped[key]["details"].append(row)

# 构建最终行集合
final_rows = []
for group in grouped.values():
    # 添加汇总行
    final_rows.append({
        "item": group["item"],
        "ingredient": " ".join(group["ingredients"]),
        "cost": f"$.{group['total_cost']:.2f}",
        "item_id": group["item_id"]
    })
    # 添加明细行
    for detail in group["details"]:
        final_rows.append({
            "item": detail["item"],
            "ingredient": detail["ingredient"],
            "cost": f"$.{detail['cost']:.2f}",
            "item_id": detail["item_id"]
        })

# 后续可将final_rows渲染为HTML表格或返回给前端
方案优势
  1. 用reduce(JS)或字典分组(Python)实现一次遍历统计,逻辑清晰,避免多层嵌套循环的混乱
  2. 先构建汇总行再追加明细行,天然保证汇总行在上方的顺序
  3. 以Item ID作为分组键,避免Item名称重复导致的分组错误
  4. 统一处理金额格式化,避免手动拼接出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:51:52