Javascript 带条件排序给出乱序结果

标签 javascript sorting

在开始之前我看了很多帖子,但我不知道如何解决这个问题。我有一个数组,我正在按照以下条件进行排序,我想要与顶部的 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/

相关文章:

javascript - 为什么有时使用点表示法访问对象属性会返回未定义?

java - ElasticSearch/Java 中日期的动态映射和嵌套排序

javascript - JSON 对象被视为字符串

javascript - 使用 C 与 Javascript 读取 USB HID 设备

javascript - 根据在第一个选择框中选择的值,将数据库表中的选项带入第二个选择框中

java - 归并排序 Java

Java : Sort integer array without using Arrays. 排序()

javascript - v-model 仅在生产中抛出 ReferenceError

javascript - 对对象数组进行排序,同时将几个对象保留在最后位置

python - 如何在 Python 中按键对字典进行排序