对于 y 维度的列,如何对字母数字列名进行自然排序?
例如:考虑列名 AA1、AA2、AA3、AA10、AA11。这些在数据透视表 y 维度中按 AA1、AA10、AA11、AA2、AA3 的顺序列出。
所需的列顺序为 AA1、AA2、AA3、AA10、AA11
对于 y 维度的列,如何对字母数字列名进行自然排序?
例如:考虑列名 AA1、AA2、AA3、AA10、AA11。这些在数据透视表 y 维度中按 AA1、AA10、AA11、AA2、AA3 的顺序列出。
所需的列顺序为 AA1、AA2、AA3、AA10、AA11
免费 jqGrid 4.9 包含完全重写的jqPivot
. 我试图保持与以前版本的兼容性,但它包含许多高级功能。我试图在wiki中描述那里。
没那么多人用jqPivot
。所以我提醒它做什么。它获取输入数据作为源并生成新数据,这些数据将作为 jqGrid 的输入数据。另外根据输入数据和参数jqPivot
生成。在分析输入数据期间,按和 按对输入数据进行排序。的顺序或排序定义了结果网格的行顺序。的顺序或排序定义了结果网格的列顺序和结果列的总数。选项和colModel
yDimension
jqPivot
xDimension
yDimension
xDimension
yDimension
compareVectorsByX
compareVectorsByY
of 允许指定回调函数,该函数将用于按整个 x 或 y 向量进行自定义排序。重要的是要理解排序函数不仅指定列的顺序,而且通知jqPivot
哪些向量应该被解释为相同的。例如,它可以解释值12
,12.0
和012.00
as 相同并指定12.0
大于 as 6
。
我在下面描述了一些可用于自定义排序的方法xDimension
和yDimension
。
首先可以指定skipSortByX: true
或skipSortByY: true
参数。在这种情况下,输入数据必须已经按您想要的顺序排序。下一个重要选项是布尔选项caseSensitive
(具有默认值false
)和trimByCollect
(默认值true
)。caseSensitive: true
可用于按大小写区分输入数据,trimByCollect: false
并可用于保存输入数据中的尾随空格。
可以在xDimension
or yDimension
:sorttype
和中指定其他一些重要的选项sortorder
。sortorder: "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"
在排序顺序中设置在第一位。结果如下图所示
您可以使用相同的方法使用代码从答案中进行自然比较,您将实现您的要求。
在更高级的情况下,可以使用选项compareVectorsByX
和compareVectorsByY
。要求是仅将特定国家/地区放在特定年份的第一位,并在所有其他情况下保持标准顺序。相应的演示用于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 的索引。vector1
vector2