1

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

例如:考虑列名 AA1、AA2、AA3、AA10、AA11。这些在数据透视表 y 维度中按 AA1、AA10、AA11、AA2、AA3 的顺序列出。

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

4

1 回答 1

1

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

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

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

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

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

例如,我为一个问题创建了演示。有人问我以下情况。该网站包含登录名,用于标识用户所在的国家/地区。想要将用户所在的国家/地区设置为排序顺序中的第一个。该演示使用以下参数: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"在排序顺序中设置在第一位。结果如下图所示

在此处输入图像描述

您可以使用相同的方法使用代码从答案中进行自然比较,您将实现您的要求。

在更高级的情况下,可以使用选项compareVectorsByXcompareVectorsByY。要求是仅将特定国家/地区放在特定年份的第一位,并在所有其他情况下保持标准顺序。相应的演示用于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回调函数应该返回具有两个属性的对象index:和result. property的值result应该是 -1、0 或 1。property 的值index应该是 -1,如果和是不同result: 0的向量的基于 0 的索引。vector1vector2

于 2015-07-27T15:33:37.757 回答