2017-09-20 8 views
1

私は、このフィルタリングプラグインとslickgridを持っている:Slickgridスプレッドシートプラグイン数値ソート

https://github.com/danny-sg/slickgrid-spreadsheet-plugins/blob/master/ext.headerfilter.js

これはソート機能があります。

filterPlugin.onCommand.subscribe(function (e, args) { 
    dataView.fastSort(args.column.field, args.command === "sort-asc"); 

}); 

テキストフィルタリングのために素晴らしい作品が、ほとんどの私データは数値です。私が1から1000までの数字をフィルタリングすると、1,10,100などのようにソートされます。

私はオンラインで見つかった数値ソート機能を持っていますが、数値はランダムな順序で並んでいます。

私は機能をソートする]をクリックし、私はスプレッドシートの並べ替えで動作するようにそれを適応させる必要がある、しかし私は、ソートを理解していないslickgridビルトインで動作するように設計されているため、問題があると考えてい
function NumericSorter(a, b) { 
    var x = a[sortcol], y = b[sortcol]; 
    return sortdir * (x == y ? 0 : (x > y ? 1 : -1)); 
} 

これを行うのに十分な機能です。

これは、これまでの私のコードです:

filterPlugin.onCommand.subscribe(function (e, args) { 
    dataView.fastSort(args.column.field, args.command === "sort-asc"); 
    //MD added 
    if (args.column.field == "linenum") { 
     dataView.sort(NumericSorter, args.sortAsc); 
     // alert("numeric sort"); 
    } else { 
     dataView.fastSort(args.column.field, args.command === "sort-asc"); 
     // alert("text sort"); 
    } 
}); 

どのように数値の並べ替えを達成することができますか?

答えて

1

まず、fastSortはpre-IE9の回避策であり、pre-IE9をサポートしない限り使用する必要はありません。

/*** 
* Provides a workaround for the extremely slow sorting in IE. 
* Does a [lexicographic] sort on a give column by temporarily overriding Object.prototype.toString 
* to return the value of that field and then doing a native Array.sort(). 
*/ 
function fastSort(field, ascending) { 
    .... 

例4-モデルでは、次のソートコードが使用されています。

grid.onSort.subscribe(function (e, args) { 
    sortdir = args.sortAsc ? 1 : -1; 
    sortcol = args.sortCol.field; 

    if (isIEPreVer9()) { 
    // using temporary Object.prototype.toString override 
    // more limited and does lexicographic sort only by default, but can be much faster 

    var percentCompleteValueFn = function() { 
     var val = this["percentComplete"]; 
     if (val < 10) { 
     return "00" + val; 
     } else if (val < 100) { 
     return "0" + val; 
     } else { 
     return val; 
     } 
    }; 

    // use numeric sort of % and lexicographic for everything else 
    dataView.fastSort((sortcol == "percentComplete") ? percentCompleteValueFn : sortcol, args.sortAsc); 
    } else { 
    // using native sort with comparer 
    // preferred method but can be very slow in IE with huge datasets 
    dataView.sort(comparer, args.sortAsc); 
    } 
}); 

sortcol変数を含む)すべての空想ロジックがIE8以下を回避することである(注)、および他のブラウザは、基本的に1行のコードが必要です

grid.onSort.subscribe(function (e, args) { 
    dataView.sort(comparer, args.sortAsc); 
}); 

し、これは比較器です。

function comparer(a, b) { 
    var x = a[sortcol], y = b[sortcol]; 
    return (x == y ? 0 : (x > y ? 1 : -1)); 
} 

比較者の並べ替え方向を心配する必要はありません.DataViewがこれを処理します。比較者は標準のjavascript比較者です(hereを参照)。
したがって、数値が数値として格納されている場合は、何もする必要はありません。数字がテキストとして保存されている場合は、比較操作の一部として数値を数値に変換する必要があります。

+0

並べ替えに関するすべての背景情報をありがとう、非常に感謝します。私は自分のコードを簡略化しました。文字列をソートするのにうまくいきますが、数字は整理できません。だから私は、問題は数字ではなく文字列だと仮定します。それは私が0,1,2などを与えるこのフォーマット 'd [" linenum "] = i + 1;'でデータビューに追加するので奇妙です。 – matt9292

+0

このコードでも、数値をテキストとしてソートしていますが、あなたはベンを助けてくれる? 'function comparer(a、b){ var x = a [sortcol]、y = b [sortcol]; //数値の場合: if(!isNaN(parseFloat(x))){ x = parseFloat(x); } if(!isNaN(parseFloat(y))){ y = parseFloat(y); } return(x == y?0:(x> y?1:-1)); } ' – matt9292