2017-09-20 1 views
1

Ich habe eine slickgrid mit dieser Filterung Plugin:Slickgrid Tabelle numerische Plugin Art

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

Dies hat eine Sortiermerkmal:

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

}); 

Das für Text-Filterung funktioniert gut, aber die meisten meiner Daten sind numerisch. Wenn ich die Zahlen 1 bis 1000 filtere, sortiere ich als 1, 10, 100, usw.

Ich habe eine numerische Sortierfunktion, die ich online gefunden habe, aber es verdreht nur die Zahlen in zufälliger Reihenfolge.

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

Ich glaube, das Problem ist, weil sie ausgelegt ist mit der eingebauten in Arbeit slickgrid klicken Funktion zu sortieren, also muß ich es anpassen mit dem Tabellenkalkulations Art zu arbeiten, aber ich verstehe nicht, die Art Funktion genug, um dies zu tun.

Dies ist mein Code so weit:

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"); 
    } 
}); 

Wie kann ich numerische Sortierung erreichen?

Antwort

1

Beachten Sie, dass fastSort eine Problemumgehung für Pre-IE9 ist und nicht verwendet werden muss, wenn Sie Pre-IE9 unterstützen möchten.

/*** 
* 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) { 
    .... 

Im Beispiel-4-Modell wird die folgende Sortierung verwendet.

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); 
    } 
}); 

Beachten Sie, dass alle die Phantasie Logik (einschließlich der sortcol Variable) für IE8 zu umgehen oder weniger, und andere Browser benötigen grundsätzlich eine Zeile Code:

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

und dies ist der Vergleich:

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

Sie müssen sich im Vergleich nicht um die Sortierrichtung kümmern - das DataView erledigt das. Der Vergleich ist ein Standard-Javascript-Vergleich (siehe here).
Wenn also die Zahlen als Zahlen gespeichert sind, müssen Sie nichts tun. Wenn Zahlen jedoch als Text gespeichert werden, müssen Sie sie als Teil der Vergleichsoperation in Zahlen konvertieren.

+0

Dank Ben für alle Hintergrundinformationen zum Sortieren, sehr geschätzt. Ich habe meinen Code wie von Ihnen vereinfacht und es funktioniert gut für die Sortierung von Zeichenfolgen, aber nicht für Zahlen. Ich nehme an, das Problem ist, dass es sich um Strings handelt, nicht um Zahlen. Es ist seltsam, weil ich sie der Datenansicht in diesem Format hinzufüge "d [" lineum "] = i + 1;', was mir 0, 1, 2, etc. – matt9292

+0

gibt Auch mit diesem Code sortiert er immer noch die Zahlen als Text, Kannst du bitte weitere Hilfe leisten? 'Funktionsvergleicher (a, b) { varx = a [sortcol], y = b [sortcol]; // wenn es eine Nummer ist: if (! IsNaN (parseFloat (x))) { x = parseFloat (x); } if (! IsNaN (parseFloat (y))) { y = parseFloat (y); } Rückkehr (x == y? 0: (x> y? 1: -1)); } ' – matt9292