带条件的Javascript排序给出无序结果
在我开始之前,我看过很多帖子,但我不知道如何解决这个问题。我有一个数组,我正在排序,条件如下,我想要任何数组项匹配顶部的tablePrefix。当数组中的项目数为10或少于10时,它就像一个符咒,但当它为11或更多时,函数开始给出错误的排序顺序带条件的Javascript排序给出无序结果,javascript,sorting,Javascript,Sorting,在我开始之前,我看过很多帖子,但我不知道如何解决这个问题。我有一个数组,我正在排序,条件如下,我想要任何数组项匹配顶部的tablePrefix。当数组中的项目数为10或少于10时,它就像一个符咒,但当它为11或更多时,函数开始给出错误的排序顺序 var tablePrefix = 'es_officer'; columns = [ "es_officer_id", // 0 "es_officer_name", // 1 "es
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"
]
[
"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"
]
但如果删除任意两项并将列数组中的项数减少到10,则效果良好。例如,让我们删除9和10
数组中包含10项的结果
[
"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"
]
[
"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"
]
有人吗??非常感谢您的帮助。您需要做的就是为所有具有给定前缀的字符串返回true,以便将它们视为较低的值,并首先推送它们
var tablePrefix='es_service';
列=[
“高级职员id”,//0
“职员姓名”//1
“高级职员姓名”//2
“高级职员”//3
“高级职员申请状态”//4
“就业类型id”//5
“就业类型名称”//6
“es_标识”//7
“名称”//8
“服务类型id”//9
“服务类型名称”//10
“es_bps_id”//11
“es_bps_标题”//12
];
columns.sort((a,b)=>a.indexOf(tablePrefix)?1:-1);
console.log(列)代码>排序算法假定排序完全一致。这意味着a
和b
不可能同时出现,但当比较与前缀匹配的两个元素时会发生这种情况,因为即使交换元素,比较函数也会返回-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
}
}
}
对以tablePrefix
开头的项目和不以开头的项目进行排序。以前缀开头的项目首先出现
var tablePrefix='es_officer';
变量列=[
“高级职员id”,//0
“职员姓名”//1
“高级职员姓名”//2
“高级职员”//3
“高级职员申请状态”//4
“就业类型id”//5
“就业类型名称”//6
“es_标识”//7
“名称”//8
“服务类型id”//9
“服务类型名称”//10
“es_bps_id”//11
“es_bps_标题”//12
];
columns.sort((a,b)=>
{
如果(a.startsWith(tablePrefix)==b.startsWith(tablePrefix)){
返回a.localeCompare(b);
}
如果(a.startsWith(tablePrefix)){
返回-1;
}
如果(b.startsWith(表前缀)){
返回1;
}
返回0;
});
console.log(列)代码>排序仅对不以表前缀开头的内容进行排序。对于以前缀开头的项目,
的索引_返回0,这是错误的,因此所有以前缀开头的项目总是返回-1,而不是实际的比较编号,如果不排序,为什么“es_官员_姓名”在“es_bps_id”下??我会让所有的高级职员都在上面,这样他们就不会被排序了,但是为什么最后一个会被排序,你打算怎么解决呢?我已经试过这个了,问题是高级职员的部分很好,但它不会排序阵列的其余部分谢谢你这个逻辑很有效。。。但是代码中有两个语法错误,仅供他人参考。1:第一个子if未关闭,这导致语法错误2:其localeCompare非localcompare。。。但无论如何,谢谢你,我很感激。嘿,我还有一个关于排序的问题,实际上它也与这个问题有关,我应该打开一个新帖子还是编辑这个帖子???@Wcan:除非是非常相关的,首先检查这个问题是否已经得到了回答,如果不是,然后再问一个新的……谢谢你的帮助。