Javascript 数据表中的复杂计算列的总和

Javascript 数据表中的复杂计算列的总和,javascript,jquery,datatables,Javascript,Jquery,Datatables,我有一个数据表,如下所示: month_col = [13,14,15,16,17,18,19,20,21,22,23,24]; $('#revenueTable').DataTable({ scrollX: true, stateSave: true, order: [[0, 'asc']], lengthMenu: [ [ 10, 25, 50, -1 ], [ '10 rows', '25 rows', '50 rows

我有一个数据表,如下所示:

month_col = [13,14,15,16,17,18,19,20,21,22,23,24];

  $('#revenueTable').DataTable({
    scrollX: true,
    stateSave: true,
    order: [[0, 'asc']],
    lengthMenu: [
        [ 10, 25, 50, -1 ],
        [ '10 rows', '25 rows', '50 rows', 'Show all' ]
    ],
    dom: 'Bfrtip',
    columnDefs: [
            {
                "targets": [ 2,9 ],
                "visible": false,
                "searchable": false
            }
        ],
    buttons: [
      {
        extend: "colvis",
        className: "btn-sm",
        columns: [0,1,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
      },
      {
        extend: "pageLength",
        className: "btn-sm"
      },
      {
        extend: "csv",
        className: "btn-sm",
        exportOptions: {
            columns: ':visible'
        }
      },
      {
        extend: "excel",
        className: "btn-sm",
        exportOptions: {
            columns: ':visible'
        }
      },
      {
        extend: "print",
        className: "btn-sm",
        exportOptions: {
            columns: ':visible'
        }
      },
    ],
    footerCallback: function ( row, data, start, end, display ) {
      var api = this.api(), data;

      // Remove the formatting to get integer data for summation
      var intVal = function ( i ) {
          return typeof i === 'string' ?
              i.replace(/[\$,]/g, '')*1 :
              typeof i === 'number' ?
                  i : 0;
      };

      $.each(month_col, function( index, value ) {
        // Total over all pages
        total = api
          .column( value )
          .data()
          .reduce( function (a, b) {
              return intVal(a) + intVal(b);
          }, 0 );

        // Total over this page
        pageTotal = api
          .column( value, { page: 'current'} )
          .data()
          .reduce( function (a, b) {
            return intVal(a) + intVal(b);
          }, 0 );

        // Update footer
        $( api.column( value ).footer() ).html(
            '<div style="font-size: 150%;">'+pageTotal+'</div>'
        );
      });

    }

  });
month_col=[13,14,15,16,17,18,19,20,21,22,23,24];
$(“#可收入”).DataTable({
是的,
stateSave:没错,
订单:[[0,'asc']],
长度菜单:[
[ 10, 25, 50, -1 ],
[“10行”、“25行”、“50行”、“全部显示”]
],
dom:'Bfrtip',
columnDefs:[
{
“目标”:[2,9],
“可见”:假,
“可搜索”:false
}
],
按钮:[
{
扩展:“科尔维斯”,
类名:“btn sm”,
列:[0,1,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
},
{
扩展:“页面长度”,
类名:“btn sm”
},
{
扩展:“csv”,
类名:“btn sm”,
出口选择:{
列:“:可见”
}
},
{
扩展:“excel”,
类名:“btn sm”,
出口选择:{
列:“:可见”
}
},
{
扩展:“打印”,
类名:“btn sm”,
出口选择:{
列:“:可见”
}
},
],
footerCallback:函数(行、数据、开始、结束、显示){
var api=this.api(),数据;
//删除格式以获取求和的整数数据
var intVal=函数(i){
返回类型i==='string'?
i、 替换(/[\$,]/g,)*1:
i的类型=='编号'?
i:0;
};
$。每个(月\u列,函数(索引,值){
//总页数
总计=空气污染指数
.列(值)
.data()
.减少(功能a、b){
返回intVal(a)+intVal(b);
}, 0 );
//本页总计
pageTotal=api
.column(值,{page:'current'})
.data()
.减少(功能a、b){
返回intVal(a)+intVal(b);
}, 0 );
//更新页脚
$(api.column(value.footer()).html(
“+pageTotal+”
);
});
}
});
您可以在下面的表格图片中找到一些示例数据:

此时,页脚回调正在对列求和。问题是我需要在特定条件下求和:如果“项目状态”列已开始,则我添加值,但如果“项目状态”列为管道,则我需要添加值乘以获胜率


有可能吗?

绝对有可能:

//源数据示例
常数srcData=[
{name:'networkvisibility',status:'Pipeline',比率:0.3,一月:1日,二月:10日,三月:0},
{name:'networkvisibility',status:'Pipeline',比率:0.3,一月:2,二月:0,三月:20},
{name:'Security PoC',status:'Started',ratio:0,jan:0,feb:5,mar:0},
{name:'EAM Recurtive consulting',状态:'Started',比率:1,一月:1,二月:1,三月:0},
];
//数据表初始化
const dataTable=$(“#可收入”).dataTable({
数据:srcData,
订单:[],
栏目:[
{标题:'项目名称',数据:'名称'},
{标题:“项目状态”,数据:“状态”},
{title:'Win ratio(%)',data:'ratio',render:data=>data*100},
{标题:'Jan',数据:'Jan'},
{标题:'Feb',数据:'Feb'},
{标题:'Mar',数据:'Mar'}
],
drawCallback:函数(){
//附加tfoot
$(“#可收入”)。追加(“”);
//将条件总计抓取到对象中
const totals=this.api().rows({page:'current'}).data().toArray().reduce((totalsObj,entry)=>{
Object.keys(entry).slice(3).forEach(month=>totalsObj[month]=(totalsObj[month]| | 0)+(entry.status==“Pipeline”?entry[month]*entry.ratio:entry.status==“Started”?entry[month]:0);
返回totalsObj;
}, {});
//将对象渲染到tfoot行中
$(“#可收入的tfoot”).append(Object.values(totals).reduce((totalsHtml,monthTotal)=>totalsHtml+=`${monthTotal}','monthTotal:');
}
});
tfoot td{padding:10px!important}

绝对有可能:

//源数据示例
常数srcData=[
{name:'networkvisibility',status:'Pipeline',比率:0.3,一月:1日,二月:10日,三月:0},
{name:'networkvisibility',status:'Pipeline',比率:0.3,一月:2,二月:0,三月:20},
{name:'Security PoC',status:'Started',ratio:0,jan:0,feb:5,mar:0},
{name:'EAM Recurtive consulting',状态:'Started',比率:1,一月:1,二月:1,三月:0},
];
//数据表初始化
const dataTable=$(“#可收入”).dataTable({
数据:srcData,
订单:[],
栏目:[
{标题:'项目名称',数据:'名称'},
{标题:“项目状态”,数据:“状态”},
{title:'Win ratio(%)',data:'ratio',render:data=>data*100},
{标题:'Jan',数据:'Jan'},
{标题:'Feb',数据:'Feb'},
{标题:'Mar',数据:'Mar'}
],
drawCallback:函数(){
//附加tfoot
$(“#可收入”)。追加(“”);
//将条件总计抓取到对象中
const totals=this.api().rows({page:'current'}).data().toArray().reduce((totalsObj,entry)=>{
Object.keys(entry).slice(3).forEach(month=>totalsObj[month]=(totalsObj[month]| | 0)+(entry.status==“Pipeline”?entry[month]*entry.ratio:entry.status==“Started”?entry[month]:0);
返回totalsObj;
}, {});
//将对象渲染到tfoot行中
$(“#可收入的tfoot”).append(Object.values(totals).reduce((totalsHtml,monthTotal)=>totalsHtml+=`${monthTotal}','monthTotal:');
}
});
tfoot td{padding:10px!important}