带条件的Javascript排序给出无序结果

带条件的Javascript排序给出无序结果,javascript,sorting,Javascript,Sorting,在我开始之前,我看过很多帖子,但我不知道如何解决这个问题。我有一个数组,我正在排序,条件如下,我想要任何数组项匹配顶部的tablePrefix。当数组中的项目数为10或少于10时,它就像一个符咒,但当它为11或更多时,函数开始给出错误的排序顺序 var tablePrefix = 'es_officer'; columns = [ "es_officer_id", // 0 "es_officer_name", // 1 "es

在我开始之前,我看过很多帖子,但我不知道如何解决这个问题。我有一个数组,我正在排序,条件如下,我想要任何数组项匹配顶部的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"
]
[
  "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:除非是非常相关的,首先检查这个问题是否已经得到了回答,如果不是,然后再问一个新的……谢谢你的帮助。