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