Ag-grid 中的自定义排序
custom sorting in Ag-grid
下面是 ag-grid 中的 header 应用了自定义排序
{
headerName: "StudentId",
field: "StudentId",
width: 140,
editable: false,
enableRowGroup: true,
comparator: (valA, valB, n1, n2, inverse) => {
return valA.localeCompare(valB);
},
sortingOrder: ['desc', 'asc']
}
我添加自定义比较器的原因是因为数据就像
S19
S129
S176
S99
S433
S10
对提到的 header 进行排序后,您将在这样的列中得到结果
S10
S129
S176
S19
S433
S99
我很确定你们中的一些人看到结果会感到困惑,但它是正确的,因为数据包含字母和数字,所以它是字符串和比较器,根据字符串的排序工作正常。
但我想要这样的结果,因为它是人类快速可读的格式。
S10
S19
S99
S129
S176
S433
可以吗??
这不是一个 angular/ag-grid 问题,因为它是一个为您所需的排序行为设计算法的问题。看来您已经想通了除 comparator
函数之外的所有内容。
但我们需要更多详细信息。从你的小例子来看,你的算法看起来可以简单地切断每个字符串的第一个字符,然后简单地按剩余的数字排序。但是您还会期待什么其他类型的字符串呢?每个字符串总是 'S' 后跟数字吗?如果是这种情况,那么我刚才描述的将起作用。
但是如果每个字符串有 x 个字符后跟 y 个数字,那么您需要将字符串分成两部分(字符和数字)。然后先按字符排序,再按数字排序。
编辑:Op 已指定字符串始终是 'S' 后跟数字 ,因此我在此处编写自定义比较器函数。
comparator: (valA, valB, n1, n2, inverse) => {
const digitsA = parseInt(valA.substring(1));
const digitsB = parseInt(valB.substring(1));
return digitsA - digitsB;
}
这基本上是从每个字符串中提取数字,将它们转换为数字并简单地返回差值。请注意,如果返回值小于 0,则表示 A 在列表中位于 B 之前。
下面是 ag-grid 中的 header 应用了自定义排序
{
headerName: "StudentId",
field: "StudentId",
width: 140,
editable: false,
enableRowGroup: true,
comparator: (valA, valB, n1, n2, inverse) => {
return valA.localeCompare(valB);
},
sortingOrder: ['desc', 'asc']
}
我添加自定义比较器的原因是因为数据就像
S19
S129
S176
S99
S433
S10
对提到的 header 进行排序后,您将在这样的列中得到结果
S10
S129
S176
S19
S433
S99
我很确定你们中的一些人看到结果会感到困惑,但它是正确的,因为数据包含字母和数字,所以它是字符串和比较器,根据字符串的排序工作正常。
但我想要这样的结果,因为它是人类快速可读的格式。
S10
S19
S99
S129
S176
S433
可以吗??
这不是一个 angular/ag-grid 问题,因为它是一个为您所需的排序行为设计算法的问题。看来您已经想通了除 comparator
函数之外的所有内容。
但我们需要更多详细信息。从你的小例子来看,你的算法看起来可以简单地切断每个字符串的第一个字符,然后简单地按剩余的数字排序。但是您还会期待什么其他类型的字符串呢?每个字符串总是 'S' 后跟数字吗?如果是这种情况,那么我刚才描述的将起作用。
但是如果每个字符串有 x 个字符后跟 y 个数字,那么您需要将字符串分成两部分(字符和数字)。然后先按字符排序,再按数字排序。
编辑:Op 已指定字符串始终是 'S' 后跟数字 ,因此我在此处编写自定义比较器函数。
comparator: (valA, valB, n1, n2, inverse) => {
const digitsA = parseInt(valA.substring(1));
const digitsB = parseInt(valB.substring(1));
return digitsA - digitsB;
}
这基本上是从每个字符串中提取数字,将它们转换为数字并简单地返回差值。请注意,如果返回值小于 0,则表示 A 在列表中位于 B 之前。