Kendo Grid Сортировка проблем для числовых - PullRequest
0 голосов
/ 19 февраля 2020

Я использую сетку кендо для отображения данных, но при сортировке (по возрастанию или по убыванию) она отлично сортируется по строковым значениям. Но для числительных c сортировка выполняется неправильно: для сортировки требуется только первый символ, а не строковые значения, даже если он находится в цифре c. Как решить эту проблему?

1 Ответ

0 голосов
/ 24 февраля 2020

Вы можете использовать свойство gird column sortable.compare , чтобы назначить свою собственную функцию сравнения.

Тогда вам нужна естественная сортировка, подобная описанной здесь: http://web.archive.org/web/20130826203933/http: //my.opera.com/GreyWyvern/blog/show.dml/1671288 и реализовано здесь: http://www.davekoelle.com/files/alphanum.js

Вот демонстрация с использованием регистронезависимая версия натуральной сортировки: https://dojo.telerik.com/eReHUReH

 function AlphaNumericCaseInsensitive(a, b) {

    if (!a || a.length < 1) return -1;
    var anum = Number(a);
    var bnum = Number(b);
    if (!isNaN(anum) && !isNaN(bnum)) {
        return anum - bnum;
    }


    function chunkify(t) {
        var tz = new Array();
        var x = 0, y = -1, n = 0, i, j;

        while (i = (j = t.charAt(x++)).charCodeAt(0)) {
            var m = (i == 46 || (i >= 48 && i <= 57));
            if (m !== n) {
                tz[++y] = "";
                n = m;
            }
            tz[y] += j;
        }
        return tz;
    }

    var aa = chunkify(a ? a.toLowerCase() : "");
    var bb = chunkify(b ? b.toLowerCase() : "");
    for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
            var c = Number(aa[x]), d = Number(bb[x]);
            if (!isNaN(c) && !isNaN(d)) {
                return c - d;
            } else return (aa[x] > bb[x]) ? 1 : -1;
        }
    }
    return aa.length - bb.length;
}



var dataSource = new kendo.data.DataSource({
    data: [
        { id: 1, item: "item101" },
        { id: 2, item: "item2" },
        { id: 3, item: "item11" },
        { id: 4, item: "item1" }
    ]
});

$("#grid").kendoGrid({
    dataSource: dataSource,
    sortable: true,
    columns: [{
        field: "item",
        sortable: {
            compare: function(a, b) {
                return AlphaNumericCaseInsensitive(a.item, b.item);
            }
        }
    }]
});
...