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

如何在JavaScript中透视对象数组并展示到HTML表格及数值计算

你现有代码的核心问题是原始数据中不存在title字段,导致透视数组生成逻辑失效。按照你描述的「子分类为行、等级为列、销售额聚合求和、支持横向纵向总计」的需求,可参考以下实现:

实现代码

const data=[{
  "Id": 1,
  "Grade": "Grade A",
  "category": "Grains",
  "subCategory": "Maize",
  "sales": 1200
},
{
  "Id": 2,
  "Grade": "Grade B",
  "category": "Grains",
  "subCategory": "Wheat",
  "sales": 130
},
{
  "Id": 3,
  "Grade": "Grade B",
  "category": "Grains",
  "subCategory": "Banana",
  "sales": 1200
},
{
  "Id": 4,
  "Grade": "Grade C",
  "category": "Grains",
  "subCategory": "Apple",
  "sales": 1400
},
{
  "Id": 5,
  "Grade": "Grade A",
  "category": "Grains",
  "subCategory": "Maize",
  "sales": 1200
},
{
  "Id": 6,
  "Grade": "Grade B",
  "category": "Grains",
  "subCategory": "Wheat",
  "sales": 130
},
{
  "Id": 7,
  "Grade": "Grade B",
  "category": "Grains",
  "subCategory": "Banana",
  "sales": 1200
},
{
  "Id": 8,
  "Grade": "Grade C",
  "category": "Grains",
  "subCategory": "Apple",
  "sales": 1400
},
{
  "Id": 7,
  "Grade": "Grade B",
  "category": "Grains",
  "subCategory": "Banana",
  "sales": 1200
},
{
  "Id": 8,
  "Grade": "Grade C",
  "category": "Grains",
  "subCategory": "Apple",
  "sales": 1400
}]

// 步骤1:提取唯一的列维度(Grade)和行维度(subCategory),如需调整聚合维度可修改此处字段
const grades = [...new Set(data.map(item => item.Grade))]
const subCategories = [...new Set(data.map(item => item.subCategory))]

// 步骤2:计算每个交叉点的销售额总和
const pivotValueMap = data.reduce((acc, cur) => {
  const crossKey = `${cur.subCategory}_${cur.Grade}`
  acc[crossKey] = (acc[crossKey] || 0) + cur.sales
  return acc
}, {})

// 步骤3:生成带行总计的表格行数据
const tableBodyRows = subCategories.map(sub => {
  const rowItem = { subCategory: sub }
  let rowSum = 0
  grades.forEach(grade => {
    const val = pivotValueMap[`${sub}_${grade}`] || 0
    rowItem[grade] = val
    rowSum += val
  })
  rowItem.行总计 = rowSum
  return rowItem
})

// 步骤4:生成带列总计的底部合计行
const totalRow = { subCategory: '列总计' }
let grandTotal = 0
grades.forEach(grade => {
  const colSum = tableBodyRows.reduce((sum, row) => sum + row[grade], 0)
  totalRow[grade] = colSum
  grandTotal += colSum
})
totalRow.行总计 = grandTotal

// 最终透视表数据(可直接用于渲染表格)
const finalPivotTable = [...tableBodyRows, totalRow]
console.log(finalPivotTable)

输出说明

最终生成的finalPivotTable数组每一项对应表格的一行,包含子分类、各等级对应的销售额、行总计,最后一项为所有列的合计值,你可以直接用该数组渲染HTML表格或者各类前端组件库的表格组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:57:01