2017-09-20 6 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 등으로 정렬됩니다.

온라인에서 찾은 숫자 정렬 기능이 있지만 임의의 순서로 숫자를 뒤죽박죽 처리합니다.

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

나는 내장하여 정렬을 클릭 slickgrid 기능과 함께 작동하도록 설계되어 있기 때문에 문제가 믿고, 그래서 나는 그러나 나는 종류를 이해하지 못하고, 스프레드 시트 정렬 작업에 적응해야 이 기능을 수행하기에 충분합니다.

이 내 코드는 지금까지 있습니다 :

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은 IE9 이전 버전의 해결 방법이며 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 이하에 대한 해결 방법을 참고하고, 다른 브라우저는 기본적으로 한 줄의 코드가 필요합니다

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

정렬에 대한 모든 배경 정보를 제공해 주신 Ben에게 감사드립니다. 나는 당신에 따라 코드를 간소화했으며 문자열 정렬에 대해서는 잘 작동하지만 숫자는 그렇지 않습니다. 그래서 문제는 숫자가 아니라 문자열이라는 것입니다. 그것은 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