【问题标题】:How to do natural sort/alpha numeric sort over columns for y-dimension in jqGrid pivot table如何对jqGrid数据透视表中的y维列进行自然排序/字母数字排序
【发布时间】:2015-07-26 06:32:33
【问题描述】:

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

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

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

【问题讨论】:

  • 这是“自然”的字母顺序。实现您想要的需要您编写自己的排序方法,将字符串分成两部分,第一部分仅由数字第二部分中的字母组成,并分别比较两者。这意味着您的字符串始终遵循此模式。如果图案交替变化几次字母和数字,那将变得更加棘手。
  • 假设我编写了这个函数,如何配置 jqGrid 数据透视表以在 y 维度排序列时使用它?
  • 有一些解释什么是自然排序。我想你很清楚你的意思。 sort 的一些实现相对复杂(例如,参见here)。一般来说,您需要使用compareVectorsByY 回调来指定它。我可以在我的答案中发布一个使用回调的示例,但我想主要展示调用自定义排序的方式,并且不想长时间讨论什么是“自然排序”。
  • 我根本不知道 jqgrid,但是快速搜索“jqgrid 自定义排序”会返回一些有价值的资源,无论是在 SO 上还是在网络的其他部分......你应该看看,自己尝试,如果您有任何问题,请返回 SO,并提出一个新问题来显示您的努力(即:代码位)
  • @LaurentS.:问题是关于 pivot 网格的。有源数据是具有某些属性的数组。通过定义为 X 维度的某些属性子集对输入数据进行透视排序。它构建网格的行。然后一个排序通过定义为Y-维度的另一个属性子集输入数据。结果构建结果网格的列。因此,每个单元格都有一组输入项。最后,对每个单元格的每个结果输入项组计算聚合运算符。所以“jqgrid自定义排序”的结果大多不是问的

标签: jqgrid pivot free-jqgrid jqpivot


【解决方案1】:

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

没有多少人使用jqPivot。所以我提醒它做什么。它获取一个输入数据作为源并生成新数据,这些数据将作为jqGrid的输入数据。此外,jqPivot 根据输入数据yDimension 参数生成colModel。在分析输入数据期间,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 可用于保存输入数据中的尾随空格。

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

例如,我为one issue 创建了the demo。有人问我以下情况。该网站包含登录名,用于标识用户所在的国家/地区。想要将用户所在的国家/地区设置为排序顺序中的第一个。 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 回调函数应该返回具有两个属性的objectindexresultresult 属性的值应为 -1、0 或 1。index 属性的值应为 -1 在 result: 0 的情况下,并且是基于 0 的向量索引,其中 vector1vector2 是不同。

【讨论】:

  • 感谢@Oleg 提供如此详细的答案。给定的解决方案对我有用,所以接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多