首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有条件的Javascript排序给出了无序结果

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

Stack Overflow用户
提问于 2016-10-22 06:18:58
回答 3查看 278关注 0票数 1

在我开始之前,我看了很多帖子,但我不知道如何解决这个问题。我有一个数组,我按照下面的条件对数组进行排序,我想要任何与顶部的tablePrefix匹配的数组项。当数组中的项数为10或小于10时,它的工作方式就像一个符咒,但当它是11或更多时,函数就开始给出错误的排序顺序。

代码语言:javascript
复制
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项的结果

代码语言:javascript
复制
[
  "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项的结果

代码语言:javascript
复制
[
  "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"
]

有人吗?我们会感谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-22 06:48:03

排序算法假定排序是完全一致的。这意味着不可能同时使用a < bb < a,但是当您比较匹配前缀的两个元素时会发生这种情况,因为即使您交换元素,您的比较函数也会返回-1

如果您违反了有关比较函数的算法要求,那么任何事情都可能发生(例如,气泡排序算法将永远循环)。显然,ECMA标准更为宽容,只讨论了任意实现定义的排序顺序:挂起、崩溃或元素复制/删除不会发生在标准实现中。

还请注意,如果a匹配,则需要在使用localCompare之前检查b是否也匹配,如果希望所有匹配都出现在前面。

代码语言:javascript
复制
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
      }
   }
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-22 06:53:02

对以tablePrefix开头的项和不以前缀开头的项进行排序。

代码语言:javascript
复制
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);

票数 1
EN

Stack Overflow用户

发布于 2016-10-22 06:35:15

您所需要做的就是对所有具有给定前缀的字符串返回true,因此它们被认为是一个较低的字符串,并首先推送它们。

代码语言:javascript
复制
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);

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40188987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档