2016-10-07 5 views
1

私のjavascriptではあまりよくありませんが、最近集計されたテーブルを出力するライブラリで作業する必要があります。 fin-hypergridを使用していました。javascript:指定されたデミカルな場所に関数の出力を変更します。

はそうようなテーブル内の集計値を計算することができるように、私は、オブジェクトに(この例ではrollups.sum(11))SUM関数を挿入する必要が一部あった:

aggregates = {Value: rollups.sum(11)} 

私は小数点以下2桁を返してみましたし、この値を変更したいと思います:

rollups.sum(11).toFixed(2) 

しかし、それはエラーを与える:「rollups.sum(...)toFixedは関数ではありません。」

を私がsomethiを試してみると様NG:それは関数オブジェクトでなければならない

を「(NaNに新しい文字列(のプロパティに割り当てることはできません」「ではないオブジェクト)):」

parseFloat(rollups.sum(11)).toFixed(2) 

はエラーをスロー。

関数rollups.sum(11)を変更して小数点以下2桁の関数オブジェクトを返す方法があるかどうか分かりますか?

(サイド情報:rollups.sum(11)が得られるモジュールから来ている:

sum: function(columnIndex) { 
    return sum.bind(this, columnIndex); 
} 

申し訳

私が原因のデータの機密性の問題のために、ここでのサンプル出力を送信できませんでした。 しかし、ここに私が従う例のコードがあります。基本的に小数点以下の桁数を与えるためにロールアップを変更する必要があります。ここで和(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; 
    } 
} 
+0

sum関数のサンプル出力を提供しますか?私はすでに 'parseFloat(rollups.sum(11))。toFixed(2)'がうまく働いていて、両方のケースで数字と文字列の返り値の出力をテストしました –

+0

sum(11)の返り値を表示できますか?あなたが扱っているデータ構造の種類。 –

+0

申し訳ありませんが、データが機密であるためサンプル出力を掲載することはできません。しかし、ここで宗教的に私が従う例があります。[link](https://openfin.github.io/fin-hypergrid/)基本的に、「集計」チェックボックスをクリックすると、値が合計されます。私はちょうど2小数を出力する合計形式を変更しようとしたいと思います。この例のスクリプトは、[link](https://openfin.github.io/fin-hypergrid/js/demo.js)にあります。 – NoobPoke

答えて

0

あなたは試みることがあります。

//all formatting and rendering per cell can be overridden in here 
dataModel.getCell = function(config, rendererName) { 
    if(aggViewOn) 
    { 
     if(config.columnName == "total_pets") 
     { 
      if(typeof(config.value) == 'number') 
      { 
       config.value = config.value.toFixed(2); 
      } 
      else if(config.value && config.value.length == 3 && typeof(config.value[1]) == 'number') 
      { 
       config.value = config.value[1].toFixed(2); 
      } 
     } 
    } 
    return grid.cellRenderers.get(rendererName); 
}; 
:括弧内の数字は、ブラウザを作るように思われる囲む

(rollups.sum(11)).toFixed(2) 

は、識別子は、数値リテラル

編集した#2の直後に開始することができない制限をバイパス

+0

ありがとうございました!私はそれを試みましたが、エラーを返します:TypeError:rollups.sum(...)toFixedは関数ではありません。私はどのような変更でも、代わりに関数オブジェクトを返すことになると思います。 – NoobPoke

+0

セルレンダリングのオーバーライドについては、@ NoobPoke?私の編集した答えを見てください –

+0

こんにちは、私はこのコードを集計トグルの定義の直後に配置しました。その後、すべてのセルが黄色に変わり、 "レンダラーが定義されていません"というテキストが表示されます – NoobPoke

関連する問題