具有重复单元格编号的 footerCallback
footerCallback with duplicate cell numbers
我正在尝试在另一个单元格上使用带条件的 footerCallback。我看到并重播了这个问题:.
我在那里写道,当单元格具有相同的数字时,总和是错误的。在我的代码中,我不使用 _each
。我试图在我的代码中实现它,但我需要对每个总和创建不同的算术运算。
下面是需要排除System Architect的薪水(这里为简单起见我删掉了零)的情况下总和错误的情况:
HTML:
<div class="row">
<div class="large-12 columns">
<table id="example" class="display nowrap table1" cellspacing="0" width="100%">
<thead>
<tr>
<th>Seq.</th>
<th>Name</th>
<th>Position</th>
<th>Salary</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Seq.</th>
<th>Name</th>
<th>Position</th>
<th>Salary</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>1</td>
<td>Tiger Nixon</td>
<td>System Architect</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>Garrett Winters</td>
<td>Accountant</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>Ashton Cox</td>
<td>Junior Technical Author</td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>Cedric Kelly</td>
<td>Senior Javascript Developer</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>Airi Satou</td>
<td>Accountant</td>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
jQuery:
$(document).ready(function() {
var table = $('#example').DataTable( {
rowReorder: {
selector: 'td:nth-child(2)'
},
responsive: true,
scrollX: true,
scrollY: "80vh",
scrollCollapse: true,
paging: true,
lengthChange: false,
lengthMenu: [ [10, 25, -1], [10, 25, "All"] ],
"order": [[ 0, "asc" ]],
"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;
};
// Total over all pages
total = api
.column( 3 )
.data()
.reduce(function (a, b) {
var cur_index = api.column(3).data().indexOf(b);
if (api.column(2).data()[cur_index] != "System Architect") {
return intVal(a) + intVal(b);
}
else { return intVal(a); }
}, 0 );
// Total over this page
pageTotal = api
.column( 3, { page: 'current'} )
.data()
.reduce( function (a, b) {
return intVal(a) + intVal(b);
}, 0 );
// Update footer
$( api.column( 3 ).footer() ).html(
'$'+total+'/ all $'+pageTotal
);
},
buttons: ['pdf', 'print']
} );
table.buttons().container()
.appendTo( '#example_wrapper .small-6.columns:eq(0)' );
} );
$(document).foundation();
Fiddle 问题:https://jsfiddle.net/62bmu4so/
我会将您的过滤总数方法更改为:
filteredTotal = api.rows().data().reduce(function (a, b) {
salary = b[2] === "System Architect" ? 0 : intVal(b[3]);
return a + salary;
}, 0 );
console.log(filteredTotal); // just for demo/testing
因此,我不会只处理 reduce
函数中的一列,而是按 rows()
处理。
这意味着reduce
函数中b
的值是一个包含当前行数据的数组。使用它,我们可以检查 b[2]
中的职位是否与我们的过滤器值匹配 - 如果 b[2]
匹配,则强制 b[3]
为零。
这意味着:
- 您不再跳过需要在
reduce()
中执行的任何求和
- 您不再需要执行额外的索引查找步骤。
评论:“其中“高级 Javascript 开发人员”也可以排除”:
您可以这样做 - 将过程分为 2 个步骤以使代码更清晰:
// filterMe will be true or false:
filterMe = b[2] === "System Architect" || b[2] === "Senior Javascript Developer";
// if filterMe is true then use 0, otherwise use the actual amount from b[3]:
salary = filterMe ? 0 : intVal(b[3]);
我还没有测试过,但应该可以。
我正在尝试在另一个单元格上使用带条件的 footerCallback。我看到并重播了这个问题:
我在那里写道,当单元格具有相同的数字时,总和是错误的。在我的代码中,我不使用 _each
。我试图在我的代码中实现它,但我需要对每个总和创建不同的算术运算。
下面是需要排除System Architect的薪水(这里为简单起见我删掉了零)的情况下总和错误的情况:
HTML:
<div class="row">
<div class="large-12 columns">
<table id="example" class="display nowrap table1" cellspacing="0" width="100%">
<thead>
<tr>
<th>Seq.</th>
<th>Name</th>
<th>Position</th>
<th>Salary</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Seq.</th>
<th>Name</th>
<th>Position</th>
<th>Salary</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>1</td>
<td>Tiger Nixon</td>
<td>System Architect</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>Garrett Winters</td>
<td>Accountant</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>Ashton Cox</td>
<td>Junior Technical Author</td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>Cedric Kelly</td>
<td>Senior Javascript Developer</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>Airi Satou</td>
<td>Accountant</td>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
jQuery:
$(document).ready(function() {
var table = $('#example').DataTable( {
rowReorder: {
selector: 'td:nth-child(2)'
},
responsive: true,
scrollX: true,
scrollY: "80vh",
scrollCollapse: true,
paging: true,
lengthChange: false,
lengthMenu: [ [10, 25, -1], [10, 25, "All"] ],
"order": [[ 0, "asc" ]],
"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;
};
// Total over all pages
total = api
.column( 3 )
.data()
.reduce(function (a, b) {
var cur_index = api.column(3).data().indexOf(b);
if (api.column(2).data()[cur_index] != "System Architect") {
return intVal(a) + intVal(b);
}
else { return intVal(a); }
}, 0 );
// Total over this page
pageTotal = api
.column( 3, { page: 'current'} )
.data()
.reduce( function (a, b) {
return intVal(a) + intVal(b);
}, 0 );
// Update footer
$( api.column( 3 ).footer() ).html(
'$'+total+'/ all $'+pageTotal
);
},
buttons: ['pdf', 'print']
} );
table.buttons().container()
.appendTo( '#example_wrapper .small-6.columns:eq(0)' );
} );
$(document).foundation();
Fiddle 问题:https://jsfiddle.net/62bmu4so/
我会将您的过滤总数方法更改为:
filteredTotal = api.rows().data().reduce(function (a, b) {
salary = b[2] === "System Architect" ? 0 : intVal(b[3]);
return a + salary;
}, 0 );
console.log(filteredTotal); // just for demo/testing
因此,我不会只处理 reduce
函数中的一列,而是按 rows()
处理。
这意味着reduce
函数中b
的值是一个包含当前行数据的数组。使用它,我们可以检查 b[2]
中的职位是否与我们的过滤器值匹配 - 如果 b[2]
匹配,则强制 b[3]
为零。
这意味着:
- 您不再跳过需要在
reduce()
中执行的任何求和
- 您不再需要执行额外的索引查找步骤。
评论:“其中“高级 Javascript 开发人员”也可以排除”:
您可以这样做 - 将过程分为 2 个步骤以使代码更清晰:
// filterMe will be true or false:
filterMe = b[2] === "System Architect" || b[2] === "Senior Javascript Developer";
// if filterMe is true then use 0, otherwise use the actual amount from b[3]:
salary = filterMe ? 0 : intVal(b[3]);
我还没有测试过,但应该可以。