Я не очень хорошо знаком с моим javascript, но недавно мне нужно было работать с библиотекой для вывода агрегированной таблицы. Использул fin-hypergrid.javascript: вывести выход функции в указанное место.
Был частью, где мне нужно вставить функцию SUM (rollups.sum (11) в этом примере) к объекту, так что он может вычислить агрегированное значение в таблице следующим образом:
aggregates = {Value: rollups.sum(11)}
Я хотел бы изменить это значение для возврата 2 знака после запятой и попробовал:
rollups.sum(11).toFixed(2)
Однако он дает ошибку: «rollups.sum (...) toFixed не является функцией.»
Если я попробую что-нибудь нг как:
parseFloat(rollups.sum(11)).toFixed(2)
он выдает ошибку: «не может назначить свойства (новой строки (» NaN «)): не объект»
поэтому он должен быть функцией объекта.
Могу ли я узнать, есть ли способ изменить функцию rollups.sum (11), чтобы вернуть объект функции с двумя десятичными знаками?
(сторона информация: rollups.sum (11) поступает из модуля, который дает:
sum: function(columnIndex) {
return sum.bind(this, columnIndex);
}
)
К сожалению, я не мог отправить пример вывода здесь в связи с вопросами конфиденциальности данных. Однако, вот код из приведенного ниже примера. Мне в основном нужно менять rollups, чтобы дать десятичные знаки. «11» в сумме (11) здесь относится к «индексу столбца».
window.onload = function() {
var Hypergrid = fin.Hypergrid;
var drillDown = Hypergrid.drillDown;
var TreeView = Hypergrid.TreeView;
var GroupView = Hypergrid.GroupView;
var AggView = Hypergrid.AggregationsView;
// List of properties to show as checkboxes in this demo's "dashboard"
var toggleProps = [{
label: 'Grouping',
ctrls: [
{ name: 'treeview', checked: false, setter: toggleTreeview },
{ name: 'aggregates', checked: false, setter: toggleAggregates },
{ name: 'grouping', checked: false, setter: toggleGrouping}
]
}
];
function derivedPeopleSchema(columns) {
// create a hierarchical schema organized by alias
var factory = new Hypergrid.ColumnSchemaFactory(columns);
factory.organize(/^(one|two|three|four|five|six|seven|eight)/i, { key: 'alias' });
var columnSchema = factory.lookup('last_name');
if (columnSchema) {
columnSchema.defaultOp = 'IN';
}
//factory.lookup('birthState').opMenu = ['>', '<'];
return factory.schema;
}
var customSchema = [
{ name: 'last_name', type: 'number', opMenu: ['=', '<', '>'], opMustBeInMenu: true },
{ name: 'total_number_of_pets_owned', type: 'number' },
{ name: 'height', type: 'number' },
'birthDate',
'birthState',
'employed',
{ name: 'income', type: 'number' },
{ name: 'travel', type: 'number' }
];
var peopleSchema = customSchema; // or try setting to derivedPeopleSchema
var gridOptions = {
data: people1,
schema: peopleSchema,
margin: { bottom: '17px' }
},
grid = window.g = new Hypergrid('div#json-example', gridOptions),
behavior = window.b = grid.behavior,
dataModel = window.m = behavior.dataModel,
idx = behavior.columnEnum;
console.log('Fields:'); console.dir(behavior.dataModel.getFields());
console.log('Headers:'); console.dir(behavior.dataModel.getHeaders());
console.log('Indexes:'); console.dir(idx);
var treeView, dataset;
function setData(data, options) {
options = options || {};
if (data === people1 || data === people2) {
options.schema = peopleSchema;
}
dataset = data;
behavior.setData(data, options);
idx = behavior.columnEnum;
}
// Preset a default dialog options object. Used by call to toggleDialog('ColumnPicker') from features/ColumnPicker.js and by toggleDialog() defined herein.
grid.setDialogOptions({
//container: document.getElementById('dialog-container'),
settings: false
});
// add a column filter subexpression containing a single condition purely for demo purposes
if (false) { // eslint-disable-line no-constant-condition
grid.getGlobalFilter().columnFilters.add({
children: [{
column: 'total_number_of_pets_owned',
operator: '=',
operand: '3'
}],
type: 'columnFilter'
});
}
window.vent = false;
//functions for showing the grouping/rollup capabilities
var rollups = window.fin.Hypergrid.analytics.util.aggregations,
aggregates = {
totalPets: rollups.sum(2),
averagePets: rollups.avg(2),
maxPets: rollups.max(2),
minPets: rollups.min(2),
firstPet: rollups.first(2),
lastPet: rollups.last(2),
stdDevPets: rollups.stddev(2)
},
groups = [idx.BIRTH_STATE, idx.LAST_NAME, idx.FIRST_NAME];
var aggView, aggViewOn = false, doAggregates = false;
function toggleAggregates() {
if (!aggView){
aggView = new AggView(grid, {});
aggView.setPipeline({ includeSorter: true, includeFilter: true });
}
if (this.checked) {
grid.setAggregateGroups(aggregates, groups);
aggViewOn = true;
} else {
grid.setAggregateGroups([], []);
aggViewOn = false;
}
}
function toggleTreeview() {
if (this.checked) {
treeView = new TreeView(grid, { treeColumn: 'State' });
treeView.setPipeline({ includeSorter: true, includeFilter: true });
treeView.setRelation(true, true);
} else {
treeView.setRelation(false);
treeView = undefined;
delete dataModel.pipeline; // restore original (shared) pipeline
behavior.setData(); // reset with original pipelline
}
}
var groupView, groupViewOn = false;
function toggleGrouping(){
if (!groupView){
groupView = new GroupView(grid, {});
groupView.setPipeline({ includeSorter: true, includeFilter: true });
}
if (this.checked){
grid.setGroups(groups);
groupViewOn = true;
} else {
grid.setGroups([]);
groupViewOn = false;
}
}
Вы можете предоставить образец вывода вашей функции sum? Я уже тестировал с возвратом вывода цифры и строки в обоих случаях 'parseFloat (rollups.sum (11)). ToFixed (2)' работает нормально –
вы можете показать, какое возвращаемое значение суммы (11) есть, поэтому я могу видеть с какой структурой данных вы имеете дело. –
Прошу прощения, но я не могу опубликовать образец вывода, поскольку данные являются конфиденциальными. Тем не менее, есть пример, который я следую религиозно здесь [link] (https://openfin.github.io/fin-hypergrid/). В основном, если вы нажмете на «агрегатный» флажок, он суммирует значения. Я просто хотел бы попробовать изменить формат суммы для вывода 2 десятичных знака. Сценарий примера можно найти здесь [link] (https://openfin.github.io/fin-hypergrid/js/demo.js). – NoobPoke