在开始之前我看了很多帖子,但我不知道如何解决这个问题。我有一个数组,我正在按照以下条件进行排序,我想要与顶部的 tablePrefix 匹配的任何数组项。当数组中的项目数为 10 或小于 10 时,它的工作方式就像一个魅力,但当数组中的项目数为 11 或更多时,该函数开始给出错误的排序顺序。
var tablePrefix = 'es_officer';
columns = [
"es_officer_id", // 0
"es_officer_name", // 1
"es_officer_fname", // 2
"es_officer_dob", // 3
"es_officer_apply_status", // 4
"es_employment_type_id", // 5
"es_employment_type_name", // 6
"es_designation_id", // 7
"es_designation_title", // 8
"es_service_type_id", // 9
"es_service_type_name", // 10
"es_bps_id", // 11
"es_bps_title" // 12
];
columns.sort((a, b) => a.indexOf(tablePrefix) ? a.localeCompare(b) : -1);
console.log(columns);
数组中有 12 个项目的结果
[
"es_officer_id",
"es_officer_fname",
"es_officer_dob",
"es_officer_apply_status",
"es_bps_id",
"es_officer_name", // Unordered result, this should be above es_bps_id
"es_bps_title",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name"
]
但是如果删除任意两个项目并将列数组中的项目数量减少到 10,则效果很好。例如,让我们删除 9 和 10。
数组中有 10 个项目的结果
[
"es_officer_id",
"es_officer_fname",
"es_officer_dob",
"es_officer_apply_status",
"es_officer_name", // In right order
"es_bps_id",
"es_bps_title",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name"
]
有人吗?帮助将不胜感激。
最佳答案
排序算法假定排序完全一致。这意味着 a < b
两者都不可能和b < a
,但这就是当您比较与前缀匹配的两个元素时会发生的情况,因为比较函数将返回 -1
即使你交换元素。
如果您违反了有关比较函数的算法要求,那么任何事情都可能发生(例如冒泡排序算法将永远循环)。显然,ECMA 标准更加宽容,只讨论任意实现定义的排序顺序:在标准实现中不会发生挂起、崩溃或元素重复/删除的情况。
另请注意,如果 a
匹配您需要检查是否 b
使用 localCompare
之前也匹配如果您希望所有匹配项都出现在前面。
function comp(a, b) {
if (a.indexOf(prefix)) {
if (b.indexOf(prefix)) {
return a.localCompare(b);
} else {
return 1;
}
} else {
if (b.indexOf(prefix)) {
return -1;
} else {
return 0; // All prefixed are considered equal
}
}
}
关于Javascript 带条件排序给出乱序结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40188987/