前端报表数据处理【去重、行转列、交叉、聚合】
原始数据
let data = {
    fields: ['name', 'subject', 'score'],
    data: [
        ['张三', '语文', 86],
        ['李四', '语文', 92],
        ['王五', '语文', 56],
        ['张三', '数学', 100],
        ['李四', '数学', 88],
        ['王五', '数学', 98],
        ['张三', '英语', 62],
        ['李四', '英语', 83]
    ]
}1. 简单去重罗列
Report.format(data, [{ converge: 'v' }, 2, 1])输出
| 'score' | 'subject' | 
|---|---|
| 86 | '语文' | 
| 92 | '语文' | 
| 56 | '语文' | 
| 100 | '数学' | 
| 88 | '数学' | 
| 98 | '数学' | 
| 62 | '英语' | 
| 83 | '英语' | 
2. 聚合(公式)
Report.format(data, [{
    converge: 'v',
    formula: 'sum'
}, 0, 1, 2], {
    name: '姓名',
    subject: '科目',
    score: '成绩'
})输出:
| '姓名' | '科目' | '成绩' | 
|---|---|---|
| '张三' | '语文' | 86 | 
| '李四' | '语文' | 92 | 
| '王五' | '语文' | 56 | 
| '张三' | '数学' | 100 | 
| '李四' | '数学' | 88 | 
| '王五' | '数学' | 98 | 
| '张三' | '英语' | 62 | 
| '李四' | '英语' | 83 | 
| '' | '' | 665 | 
3. 交叉聚合(公式)
Report.format(data, [{
    field: 0,
    converge: 'v',
    formula: {
        formula: 'sum',
        label: '总分'
    }
}, {
    field: 1,
    converge: 'v',
    formula: {
        formula: 'sum',
        label: '总成绩'
    }
}, 2])输出:
| 'name' | 'subject' | 'score' | 
|---|---|---|
| '张三' | '语文' | 86 | 
| '' | '数学' | 100 | 
| '' | '英语' | 62 | 
| '' | '总成绩' | 248 | 
| '李四' | '语文' | 92 | 
| '' | '数学' | 88 | 
| '' | '英语' | 83 | 
| '' | '总成绩' | 263 | 
| '王五' | '语文' | 56 | 
| '' | '数学' | 98 | 
| '' | '总成绩' | 154 | 
| '总分' | '' | 665 | 
4. 交叉聚合
Report.format(data, [{
    field: 0,
    converge: 'v',
    formula: 'avg'
}, {
    field: 1,
    converge: 'h',
    formula: 'sum'
}, 2])输出:
| 'name' | '语文' | '数学' | '英语' | 'sum' | 
|---|---|---|---|---|
| '张三' | 86 | 100 | 62 | 248 | 
| '李四' | 92 | 88 | 83 | 263 | 
| '王五' | 56 | 98 | 0 | 154 | 
| 'avg' | 78.00 | 95.33 | 48.33 | 221.67 | 
5. 交叉聚合(忽略详细)
Report.format(data, [{
    field: 0,
    converge: 'v',
    formula: 'avg'
}, {
    field: 1,
    converge: 'h',
    formula: {
        detail: false,
        formula: 'sum'
    }
}, 2])输出:
| 'name' | 'sum' | 
|---|---|
| '张三' | 248 | 
| '李四' | 263 | 
| '王五' | 154 | 
| 'avg' | 221.67 | 
6. 平级聚合
Report.format(data, [{
    converge: 'v'
}, {
    field: 1,
    converge: 'v',
    formula: {
        formula: 'sum',
        field: 2
    }
}, 2])输出:
| 'subject' | 'sum' | 'score' | 
|---|---|---|
| '语文' | 234 | 86 | 
| '' | '' | 92 | 
| '' | '' | 56 | 
| '数学' | 286 | 100 | 
| '' | '' | 88 | 
| '' | '' | 98 | 
| '英语' | 145 | 62 | 
| '' | '' | 83 | 
7. 多级交叉聚合
Report.format({
    fields: ['province', 'city', 'count', 'industry', 'type'],
    data: [
        ["湖北", "武汉", 18000, "房地产", "收入"],
        ["湖北", "武汉", 10000, "房地产", "收入"],
        ["湖北", "武汉", 2000, "卫生", "支出"],
        ["湖北", "武汉", 1200, "卫生", "支出"],
        ["湖北", "武汉", 8000, "卫生", "收入"],
        ["湖北", "武汉", 12000, "房地产", "支出"],
        ["湖北", "黄石", 1500, "卫生", "支出"],
        ["湖北", "黄石", 3500, "卫生", "收入"],
        ["湖北", "襄阳", 15800, "房地产", "收入"],
        ["湖北", "襄阳", 5800, "卫生", "收入"],
        ["湖北", "襄阳", 11800, "房地产", "支出"],
        ["湖北", "襄阳", 1800, "卫生", "支出"],
        ["湖南", "长沙", 16000, "房地产", "收入"],
        ["湖南", "长沙", 6000, "卫生", "收入"],
        ["湖南", "长沙", 11500, "房地产", "支出"],
        ["湖南", "长沙", 1500, "卫生", "支出"],
        ["湖南", "岳阳", 13600, "房地产", "收入"],
        ["湖南", "岳阳", 3600, "卫生", "收入"],
        ["湖南", "岳阳", 11000, "房地产", "支出"],
        ["湖南", "岳阳", 1000, "卫生", "支出"],
        ["江西", "南昌", 15400, "房地产", "收入"],
        ["江西", "南昌", 5400, "卫生", "收入"],
        ["江西", "南昌", 11800, "房地产", "支出"],
        ["江西", "南昌", 1800, "卫生", "支出"],
        ["江西", "九江", 14800, "房地产", "收入"],
        ["江西", "九江", 4800, "卫生", "收入"],
        ["江西", "九江", 11600, "房地产", "支出"],
        ["江西", "九江", 1600, "卫生", "支出"]
    ]
}, [{
    field: 0,
    formula: [{ formula: 'sum', label: '全国合计' }],
    converge: 'v'
}, {
    field: 1,
    formula: [{ formula: 'sum', label: '省合计' }],
    converge: 'v'
}, {
    field: 3,
    formula: [{
        formula: 'fmt',
        label: '总利润',
        format: function(data) {
            let fmt = 0;
            for (let i = 0, len = data.length; i < len; i += 2) {
                fmt += (data[i] - data[i + 1]);
            }
            return fmt;
        }
    }],
    converge: 'h'
}, {
    field: 4,
    formula: [{
        formula: 'fmt',
        label: '利润',
        format: function(data) {
            return data[0] - data[1];
        }
    }],
    converge: 'h'
}, {
    field: 2
}], { province: '省', city: '市' })输出:
| 省 | 市 | 房地产 | '' | '' | 卫生 | '' | '' | 总利润 | 
|---|---|---|---|---|---|---|---|---|
| '' | '' | 收入 | 支出 | 利润 | 收入 | 支出 | 利润 | '' | 
| 湖北 | 武汉 | 28000 | 12000 | 16000 | 8000 | 3200 | 4800 | 20800 | 
| '' | 黄石 | 0 | 0 | 0 | 3500 | 1500 | 2000 | 2000 | 
| '' | 襄阳 | 15800 | 11800 | 4000 | 5800 | 1800 | 4000 | 8000 | 
| '' | 省合计 | 43800 | 23800 | 20000 | 17300 | 6500 | 10800 | 30800 | 
| 湖南 | 岳阳 | 13600 | 11000 | 2600 | 3600 | 1000 | 2600 | 5200 | 
| '' | 长沙 | 16000 | 11500 | 4500 | 6000 | 1500 | 4500 | 9000 | 
| '' | 省合计 | 29600 | 22500 | 7100 | 9600 | 2500 | 7100 | 14200 | 
| 江西 | 九江 | 14800 | 11600 | 3200 | 4800 | 1600 | 3200 | 6400 | 
| '' | 南昌 | 15400 | 11800 | 3600 | 5400 | 1800 | 3600 | 7200 | 
| '' | 省合计 | 30200 | 23400 | 6800 | 10200 | 3400 | 6800 | 13600 | 
| 全国合计 | '' | 103600 | 69700 | 33900 | 37100 | 12400 | 24700 | 58600 | 
- 具体试验,请移步 https://github.com/shixia226/...
- 欢迎提出更多整改意见
相关推荐
  xceman    2020-10-13  
   算法与数学之美    2020-10-07  
   Anscor    2020-10-05  
   liwg0    2020-09-08  
   数学爱好者    2020-08-31  
   thermodynamicB    2020-08-11  
   夕加加    2020-07-20  
   willowwgx    2020-07-18  
   kuoying    2020-07-16  
   Anscor    2020-07-14  
   starletkiss    2020-07-08  
   kingzone    2020-06-27  
   xceman    2020-06-27  
   算法与数学之美    2020-06-21  
   kuoying    2020-06-21  
   秒懂数学    2020-06-17  
 