jqGrid使用datatype:jsonstring时分页列平均值异常问题求助
jqGrid 分页切换后平均值计算异常问题解决
问题复现与分析
在jqGrid 5.4.0及升级到5.8版本后,使用datatype: jsonstring填充数据时,会出现两个异常:
- 初始平均值计算错误:4行数据值均为100,正确平均值应为100,但实际用第一个值除以行数得出错误结果
- 分页切换后返回,平均值会被行数重复除,数值持续变小
而使用datatype: "local"模式时无此问题,核心差异在于两种模式下jqGrid的数据处理逻辑:jsonstring模式未正确保留全量数据用于统计,仅基于当前页或错误复用中间计算结果;local模式则直接操作全量数据数组,统计逻辑正常。
解决方案
1. 优先切换为datatype: "local"模式
如果业务场景允许,直接将数据转换为对象数组后传入data参数,使用local类型,完全规避jsonstring的处理bug:
var gridData = [/* 你的JSON数据数组 */]; $("#yourGridId").jqGrid({ datatype: "local", data: gridData, // 其他配置(列定义、分页、footerrow等) });
2. 自定义统计逻辑替代默认计算
若必须使用jsonstring模式,可通过gridComplete事件手动计算全量数据的平均值,覆盖jqGrid的默认统计:
$("#yourGridId").jqGrid({ datatype: "jsonstring", datastr: "/* 你的JSON字符串 */", footerrow: true, gridComplete: function() { var $grid = $(this); // 获取全量数据 var allRows = $grid.jqGrid('getGridParam', 'data'); if (!allRows || allRows.length === 0) return; // 计算指定列的总和与平均值(替换为你的目标列名,比如"score") var total = 0; var rowCount = allRows.length; allRows.forEach(row => { total += parseFloat(row.score) || 0; }); var avgValue = total / rowCount; // 将平均值设置到页脚 $grid.jqGrid('footerData', 'set', { score: avgValue.toFixed(2) }); }, // 其他配置项 });
3. 补全data参数强制保留全量数据
在jsonstring模式下,同时传入解析后的data参数,确保jqGrid能获取到全量数据用于统计:
var jsonStr = "/* 你的JSON字符串 */"; var parsedData = JSON.parse(jsonStr); $("#yourGridId").jqGrid({ datatype: "jsonstring", datastr: jsonStr, data: parsedData, footerrow: true, // 其他配置项 });
内容的提问来源于stack exchange,提问作者Kensy
相关产品推荐
相关产品推荐

