// 按照顺序的要进行统计的字段,是动态的,它们是值为非数字的字段
// 如果这里加上quater那就得再加一层季度的统计数据
let key = ['company','bank']
// 后端传来的数据
let tableData = [
{id:1,bank:'中国银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:2,bank:'中国银行',company:'广东公司',quater:'第二季度',money:200,fee:300},
{id:3,bank:'中国银行',company:'湖南公司',quater:'第一季度',money:300,fee:400},
{id:4,bank:'中国银行',company:'湖南公司',quater:'第二季度',money:400,fee:500},
{id:5,bank:'广发银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:6,bank:'广发银行',company:'广东公司',quater:'第二季度',money:500,fee:600},
{id:7,bank:'广发银行',company:'湖南公司',quater:'第一季度',money:600,fee:700},
{id:8,bank:'广发银行',company:'湖南公司',quater:'第二季度',money:600,fee:700},
]
// 根据字段顺序做映射
let map = {
"广东公司": {
"children": {
"中国银行": {
"children": [
{id:1,bank:'中国银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:2,bank:'中国银行',company:'广东公司',quater:'第二季度',money:200,fee:300},
],
"total":{bank:'中国银行合计',company:'',quater:'',money:300,fee:500}
},
"广发银行": {
"children": [
{id:5,bank:'广发银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:6,bank:'广发银行',company:'广东公司',quater:'第二季度',money:500,fee:600},
],
"total":{bank:'广发银行合计',company:'',quater:'',money:600,fee:800}
}
},
"total":{bank:'',company:'广东公司合计',quater:'',money:900,fee:1300}
},
"湖南公司": {
"children": {
"中国银行": {
"children": [
{id:3,bank:'中国银行',company:'湖南公司',quater:'第一季度',money:300,fee:400},
{id:4,bank:'中国银行',company:'湖南公司',quater:'第二季度',money:400,fee:500},
],
"total":{bank:'中国银行合计',company:'',quater:'',money:700,fee:900}
},
"广发银行": {
"children": [
{id:7,bank:'广发银行',company:'湖南公司',quater:'第一季度',money:600,fee:700},
{id:8,bank:'广发银行',company:'湖南公司',quater:'第二季度',money:600,fee:700},
],
"total":{bank:'广发银行合计',company:'',quater:'',money:1200,fee:1400}
}
},
"total":{bank:'',company:'湖南公司合计',quater:'',money:1900,fee:2300}
}
}
// 处理后的要渲染到表格的数据
let finalData = [
{id:1,company:'广东公司', bank:'中国银行', quater:'第一季度',money:100,fee:200},
{id:2,company:'', bank:'', quater:'第二季度',money:200,fee:300},
{ company:'', bank:'中国银行合计',quater:'', money:300,fee:500},
{id:5,company:'', bank:'广发银行', quater:'第一季度',money:100,fee:200},
{id:6,company:'', bank:'', quater:'第二季度',money:500,fee:600},
{ company:'', bank:'广发银行合计',quater:'', money:600,fee:800},
{ company:'广东公司合计',bank:'', quater:'', money:900,fee:1300},
{id:3,company:'湖南公司', bank:'中国银行', quater:'第一季度',money:300,fee:400},
{id:4,company:'', bank:'', quater:'第二季度',money:400,fee:500},
{ company:'', bank:'中国银行合计',quater:'', money:700,fee:900},
{id:7,company:'', bank:'广发银行', quater:'第一季度',money:600,fee:700},
{id:8,company:'', bank:'', quater:'第二季度',money:600,fee:700},
{ company:'', bank:'广发银行合计',quater:'', money:1200,fee:1400},
{ company:'湖南公司合计',bank:'', quater:'', money:1900,fee:2300}
]
请问怎么根据key和tableData获得finalData?我目前想到使用map做映射,但是代码怎么写给我难住了。
https://codepen.io/hongsir12/...
问题补充:
如果小计字段是按['bank','company','quater']
排序 ,那么需要最后处理得到的数据如下:
const tableData = [
{id:1,bank:'中国银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:2,bank:'中国银行',company:'广东公司',quater:'第二季度',money:200,fee:300},
{id:15,bank:'中国银行',company:'广东公司',quater:'第二季度',money:200,fee:300},
{id:3,bank:'中国银行',company:'湖南公司',quater:'第一季度',money:300,fee:400},
{id:4,bank:'中国银行',company:'湖南公司',quater:'第二季度',money:400,fee:500},
{id:5,bank:'广发银行',company:'武汉公司',quater:'第三季度',money:400,fee:500},
{id:6,bank:'广发银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:7,bank:'广发银行',company:'广东公司',quater:'第二季度',money:500,fee:600},
{id:8,bank:'广发银行',company:'湖南公司',quater:'第一季度',money:600,fee:700},
{id:9,bank:'广发银行',company:'湖南公司',quater:'第二季度',money:600,fee:700},
{id:10,bank:'建设银行',company:'广东公司',quater:'第一季度',money:100,fee:200},
{id:11,bank:'建设银行',company:'广东公司',quater:'第二季度',money:500,fee:600},
{id:12,bank:'建设银行',company:'湖南公司',quater:'第一季度',money:600,fee:700},
{id:13,bank:'建设银行',company:'湖南公司',quater:'第二季度',money:600,fee:700},
{id:14,bank:'建设银行',company:'湖南公司',quater:'第三季度',money:600,fee:700},
]
// 处理后的数据:
// 要求每一级别相同的值进行单元格合并,而为此该级别的字段的值只能出现一次
const finalData = [
{"id": 1,"bank": "中国银行","company": "广东公司","quater": "第一季度","money": 100,"fee": 200},
{ "bank": "", "company": "", "quater": "第一季度小计","money": 100,"fee": 200},
{"id": 2,"bank": "", "company": "", "quater": "第二季度","money": 200,"fee": 300},
{"id": 15,"bank": "", "company": "", "quater": "", "money": 200,"fee": 300},
{ "bank": "", "company": "", "quater": "第二季度小计","money": 400,"fee": 600},
{ "bank": "", "company": "广东公司小计","quater": "","money": 500,"fee": 800},
{"id": 3,"bank": "", "company": "湖南公司", "quater": "第一季度","money": 300,"fee": 400},
{ "bank": "", "company": "", "quater": "第一季度小计","money": 300,"fee": 400},
{"id": 4,"bank": "", "company": "", "quater": "第二季度","money": 400,"fee": 500},
{ "bank": "", "company": "", "quater": "第二季度小计","money": 400,"fee": 500},
{ "bank": "", "company": "湖南公司小计","quater": "","money": 700,"fee": 900},
{ "bank": "中国银行小计","company": "", "quater": "","money": 1200,"fee": 1700},
{"id": 6,"bank": "广发银行", "company": "广东公司", "quater": "第一季度","money": 100,"fee": 200},
{ "bank": "", "company": "", "quater": "第一季度小计","money": 100,"fee": 200},
{"id": 7,"bank": "", "company": "", "quater": "第二季度","money": 500,"fee": 600},
{ "bank": "", "company": "", "quater": "第二季度小计","money": 500,"fee": 600},
{ "bank": "", "company": "广东公司小计","quater": "","money": 600,"fee": 800},
{"id": 8, "bank": "", "company": "湖南公司", "quater": "第一季度","money": 600,"fee": 700},
{ "bank": "", "company": "", "quater": "第一季度小计","money": 600,"fee": 700},
{ "id": 9,"bank": "", "company": "", "quater": "第二季度","money": 600,"fee": 700},
{ "bank": "", "company": "", "quater": "第二季度小计","money": 600,"fee": 700},
{ "bank": "", "company": "湖南公司小计", "quater": "","money": 1200,"fee": 1400},
{"id": 5,"bank": "", "company": "武汉公司", "quater": "第三季度", "money": 400,"fee": 500},
{ "bank": "", "company": "", "quater": "第三季度小计", "money": 400,"fee": 500},
{ "bank": "", "company": "武汉公司小计", "quater": "","money": 400,"fee": 500},
{ "bank": "广发银行小计","company": "", "quater": "","money": 2200,"fee": 2700},
{"id": 10, "bank": "建设银行", "company": "广东公司", "quater": "第一季度","money": 100, "fee": 200},
{ "bank": "", "company": "", "quater": "第一季度小计","money": 100,"fee": 200},
{"id": 11,"bank": "", "company": "", "quater": "第二季度","money": 500,"fee": 600},
{ "bank": "", "company": "", "quater": "第二季度小计","money": 500,"fee": 600},
{ "bank": "", "company": "广东公司小计", "quater": "","money": 600,"fee": 800},
{"id": 12,"bank": "", "company": "湖南公司", "quater": "第一季度", "money": 600,"fee": 700},
{ "bank": "", "company": "", "quater": "第一季度小计", "money": 600,"fee": 700},
{"id": 13,"bank": "", "company": "", "quater": "第二季度", "money": 600, "fee": 700 },
{ "bank": "", "company": "", "quater": "第二季度小计", "money": 600,"fee": 700},
{"id": 14,"bank": "", "company": "", "quater": "第三季度", "money": 600,"fee": 700},
{ "bank": "", "company": "", "quater": "第三季度小计","money": 600,"fee": 700},
{ "bank": "", "company": "湖南公司小计", "quater": "","money": 1800,"fee": 2100},
{ "bank": "建设银行小计","company": "", "quater": "","money": 2400,"fee": 2900}
]
分组求和递归版,输出扁平列表
看你代码,是分成两步处理,其实也可以合成一步
参考代码:
重构了一下函数
主要改了分组代码,如果不是组内第一个
item
则删除该item
的分组字段改为
完整代码:
如果分组字段是数字,输出顺序可能会乱,因为对象的数字键会被自动排序,这时可以改用 Map 进行分组
修改后的代码: