在我开始之前,我看了很多帖子,但我不知道如何解决这个问题。我有一个数组,我按照下面的条件对数组进行排序,我想要任何与顶部的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"
]但是,如果移除任何两个项,并将列数组中的项的no减少到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"
]有人吗?我们会感谢你的帮助。
发布于 2016-10-22 06:48:03
排序算法假定排序是完全一致的。这意味着不可能同时使用a < b和b < a,但是当您比较匹配前缀的两个元素时会发生这种情况,因为即使您交换元素,您的比较函数也会返回-1。
如果您违反了有关比较函数的算法要求,那么任何事情都可能发生(例如,气泡排序算法将永远循环)。显然,ECMA标准更为宽容,只讨论了任意实现定义的排序顺序:挂起、崩溃或元素复制/删除不会发生在标准实现中。
还请注意,如果a匹配,则需要在使用localCompare之前检查b是否也匹配,如果希望所有匹配都出现在前面。
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
}
}
}发布于 2016-10-22 06:53:02
对以tablePrefix开头的项和不以前缀开头的项进行排序。
var tablePrefix = 'es_officer';
var 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) =>
{
if (a.startsWith(tablePrefix) == b.startsWith(tablePrefix)) {
return a.localeCompare(b);
}
if (a.startsWith(tablePrefix)) {
return -1;
}
if (b.startsWith(tablePrefix)) {
return 1;
}
return 0;
});
console.log(columns);
发布于 2016-10-22 06:35:15
您所需要做的就是对所有具有给定前缀的字符串返回true,因此它们被认为是一个较低的字符串,并首先推送它们。
var tablePrefix = 'es_service';
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) ? 1 : -1);
console.log(columns);
https://stackoverflow.com/questions/40188987
复制相似问题