Get max value of column with mRender
Get max value of column with mRender
rolfsf
Posts: 27Questions: 6Answers: 0
For each cell in one of the table's columns, I need to compare the value to the maximum value in the column, and add a style based on that. The table is being built from some JSON data.
I'm using mRender to handle the styling, but I can figure out how to get the max value of the column. I was using the following:
[code]
'mRender': function ( data, type, full ) {
if ( type === 'display' ) {
var maxV = Array.max(full[1])*1.05;
return makeBar(data, maxV);
}else{
return data;
}
}
[/code]
Array.max is expecting an array of data for the column:
[code]
Array.max = function( array ){
return Math.max.apply( Math, array );
};
[/code]
but I realize that 'full' only grabs the data for a single row.
How do I get an array of data for a single column?
Thanks!
I'm using mRender to handle the styling, but I can figure out how to get the max value of the column. I was using the following:
[code]
'mRender': function ( data, type, full ) {
if ( type === 'display' ) {
var maxV = Array.max(full[1])*1.05;
return makeBar(data, maxV);
}else{
return data;
}
}
[/code]
Array.max is expecting an array of data for the column:
[code]
Array.max = function( array ){
return Math.max.apply( Math, array );
};
[/code]
but I realize that 'full' only grabs the data for a single row.
How do I get an array of data for a single column?
Thanks!
This discussion has been closed.
Replies
Allan
the data is loading via Ajax - here's the full init
[code]
function initTable(){
oTable = $('#portfolio-table').dataTable({
"bDestroy": true,
"bProcessing": true,
"sAjaxSource": '/data/portfolio.json',
"sAjaxDataProp": portfolioView,
'aaSorting': [[ 0, 'asc' ]],
'sScrollY': '300px',
'bPaginate': false,
'bScrollCollapse': true,
'aoColumnDefs': [
{ 'aTargets': [ 1 ],
'sClass': 'bar-cell',
'mRender': function ( data, type, full ) {
if ( type === 'display' ) {
var maxV = Array.max(full[1])*1.05;
return makeBar(data, maxV);
}else{
return data;
}
}
},
{ 'aTargets': [ 2,3 ],
'sClass': 'num'
},
{ 'aTargets': [ 4 ],
'sClass': 'interest',
'mRender': function ( data, type, full ) {
if ( type === 'display' ) {
var wrappedValue = $().calcInterest(full[4]);
return wrappedValue;
}else{
return data;
}
}
}
]
});
return oTable;
}
[/code]
and the data looks something like this:
[code]
{
"Product" : [
[ "Product A", 2800000, 7, 20, 0.57 ],
[ "Product B", 2500000, 9, 16, 0.17 ],
[ "Product C", 3200000, 3, 3, 0.27 ],
[ "Product D", 900000, 4, 6, 0.88 ],
[ "Product E", 4000000, 16, 18, 0.75 ],
[ "Product F", 1900000, 8, 8, 0.12 ],
[ "Product G", 6500000, 17, 17, 0.91 ],
[ "Product H", 2100000, 5, 8, 0.68 ]
],
"Industry" : [
[ "Industry A", 2800000, 7, 20, 0.57 ],
[ "Industry B", 2500000, 9, 16, 0.17 ],
[ "Industry C", 3200000, 3, 3, 0.27 ],
[ "Industry D", 900000, 4, 6, 0.88 ],
[ "Industry E", 4000000, 16, 18, 0.75 ],
[ "Industry F", 1900000, 8, 8, 0.12 ],
[ "Industry G", 6500000, 17, 17, 0.91 ],
[ "Industry H", 2100000, 5, 8, 0.68 ]
]
}
[/code]
The 'portfolioView' variable corresponds to "Product", "Industry", etc. in the JSON - the view (and data) can be switched by clicking a button
I appreciate your suggestions!
1. Define your own fnServerData function which will make the Ajax call to get the information from the server, and then before calling the DataTables callback for the data, calculate the total into a variable which is scoped so mRender can access it (i.e. just local to the function).
2. Use the `xhr` event to do the same thing. Using the `xhr` event might be slightly easier since you don't need to define your own Ajax call.
Allan