如何在jqGrid数据透视表中对y维进行自然排序/字母数字排序

时间:2015-07-26 06:32:33

标签: jqgrid pivot free-jqgrid jqpivot

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

例如,我为the demo创建了one issue。有人问我以下情况。该网站包含登录,用于标识用户的国家/地区。人们希望将用户的国家/地区设置为排序顺序中的第一个。 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"。结果可以看到如下图所示的结果

enter image description here

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

在更高级的情况下,可以使用选项compareVectorsByXcompareVectorsByY。要求是将特定国家仅在一个特定年份放在第一个持有所有其他案件标准订单的地方。 The corresponding demo使用compareVectorsByY来实施要求。它显示

enter image description here

并使用以下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回调函数应返回对象,其中包含两个属性:indexresultresult属性的值应为-1,0或1. index属性的值在result: 0的情况下应为-1,并且为0的向量索引vector1 1}}和vector2不同。

相关问题