如何对 jqGrid pivot table 中 y 维度的列进行自然 sort/alpha 数字排序

How to do natural sort/alpha numeric sort over columns for y-dimension in jqGrid pivot table

对于 y 维度中的列,如何对字母数字列名称进行自然排序?

例如: 考虑列名 AA1、AA2、AA3、AA10、AA11。 这些在枢轴 table y 维度中按 AA1、AA10、AA11、AA2、AA3 的顺序列出。

所需的列顺序是 AA1、AA2、AA3、AA10、AA11

免费的 jqGrid 4.9 包含 jqPivot 的完全重写版本。我试图保持与以前版本的兼容性,但它包含许多高级功能。我试图在 wiki.

中描述

没有那么多人使用 jqPivot。所以我提醒它做什么。它获取一个 输入数据 作为源并生成新数据,这将是 jqGrid 的输入数据。此外 jqPivot 根据 输入数据 yDimension 参数生成 colModel。在分析 输入数据 期间,jqPivotxDimensionyDimension 对输入数据进行排序。 xDimension 的顺序或排序定义了结果网格的 的顺序。 yDimension 的顺序或排序定义了结果网格的 的顺序和结果列的总数。的选项 compareVectorsByXcompareVectorsByY 允许指定回调函数,该回调函数将用于按整个 x 或 y 向量进行自定义排序。重要的是要理解排序函数不仅指定 列的顺序 ,而且它通知 jqPivot 哪些向量应该被解释为相同的 [=117] =].例如,它可以将值 1212.0012.00 解释为相同,并指定 12.0 大于 6

我在下面描述了一些可用于按 xDimensionyDimension 自定义排序的方法。

首先可以指定 skipSortByX: trueskipSortByY: true 参数。在这种情况下,输入数据必须已经按照您想要的顺序排序。下一个重要选项是布尔选项 caseSensitive(默认值 false)和 trimByCollect(默认值 true)。 caseSensitive: true 可用于区分输入数据,trimByCollect: false 可用于保留输入数据中的尾随空格。

可以在 xDimensionyDimension 中指定其他一些重要选项:sorttypesortordersortorder: "desc" 可用于反转排序数据的顺序。选项sorttype可以是"integer"(或"int"),表示在排序时截断(Math.floor(Number(inputValue)))输入数据;值 "number""currency""float" 表示在排序期间应将输入数据转换为数字 (Number(inputValue))。最后,可以 不指定任何 sorttype,而是指定 compare 回调函数 compare 回调函数有两个参数,它应该 return 众所周知的 -1、0 或 1 值。

例如我创建的 the demo for one issue. One asked my about the following situation. The web site contains login, which identifies the country of the user. One want to set the user's country as the first in the sorting order. The demo 使用以下 yDimension 参数:

yDimension: [
    { dataName: "sellyear", sorttype: "integer" },
    { dataName: "sell month",
        compare: function (a, b) {
            if (a === "Germany") { return b !== "Germany" ? -1 : 0; }
            if (b === "Germany") { return 1; }
            if (a > b) { return 1; }
            if (a < b) { return -1; }
            return 0;
        }}
]

它设置 "Germany" 在排序顺序中的第一个。结果如下图所示

您可以使用相同的方法使用来自 the answer 的自然比较代码,您将实现您的要求。

在更高级的情况下,可以使用选项 compareVectorsByXcompareVectorsByY。要求是将特定国家仅在特定年份置于首位,对所有其他情况保持标准顺序。 The corresponding demo 使用 compareVectorsByY 来实现需求。它显示

并使用以下 compareVectorsByY:

compareVectorsByY: function (vector1, vector2) {
    var fieldLength = this.fieldLength, iField, compareResult;

    if (fieldLength === 2) {
        if (vector1[0] === "2011" && vector1[1] === "Germany") {
            if (vector2[0] === "2011" && vector2[1] === "Germany") {
                return {
                    index: -1,
                    result: 0
                };
            }
            return {
                index: vector2[0] === "2011" ? 1 : 0,
                result: -1
            };
        }
        // any vector1 is larger as vector2 ("2011", "Germany")
        if (vector2[0] === "2011" && vector2[1] === "Germany") {
            return {
                index: vector2[0] === "2011" ? 1 : 0,
                result: 1
            };
        }
    }

    for (iField = 0; iField < fieldLength; iField++) {
        compareResult = this.fieldCompare[iField](vector1[iField], vector2[iField]);
        if (compareResult !== 0) {
            return {
                index: iField,
                result: compareResult
            };
        }
    }
    return {
        index: -1,
        result: 0
    };
}

值得一提的是 compareVectorsByY 回调函数应该 return object 具有两个属性:indexresultresult 属性 的值应为 -1、0 或 1。index 属性 的值应为 -1 result: 0 且为 0 - 基于向量的索引,其中 vector1vector2 不同。