当前位置: 首页 > 知识库问答 >
问题:

按多个前缀排序数组

葛承德
2023-03-14

我有一个数组的值。我用一个条件对它进行排序,以保持某些项目在顶部。到目前为止,这是有效的。现在我想运行两个条件,例如,我有两个前缀要与数组中的每个项相匹配:tableprefix和第二个daryprefix。我已经实现的是将tableprefix保持在顶部。其余的项目必须按字母顺序排序。

我想要达到的目标:

1:数组项匹配表前缀在最顶部//已经实现

2:与secondaryprefix匹配的数组项位于tableprefix//之后,无法识别

3:按字母顺序对其余项目进行排序//已完成

数组:

columns = [
   "es_officer_name",
   "es_officer_fname",
   "es_officer_apply_status",
   "es_officer_dob",
   "es_wl_1_11_test_id",
   "es_officer_id",
   "es_designation_id",
   "es_wl_1_11_test_edit_date",
   "es_designation_title",
   "es_employment_type_id",
   "es_employment_type_name",
   "es_service_type_id",
   "es_service_type_name",
   "es_wl_1_11_test_added_date",
   "es_bps_id",
   "es_bps_title",
   "es_department_id",
   "es_department_name"
];

前缀:

var tablePrefix = "es_wl";

排序算法:

columns.sort(function(a, b) 
{
    if (a.indexOf(tablePrefix))
    {
        if (b.indexOf(tablePrefix)) 
        {
            return a.localeCompare(b);
        } 
        else
        {
            return 1;
        }
    } 
    else
    {
        if (b.indexOf(tablePrefix)) 
        {
            return -1;
        }
        else 
        {
            return 0; // All prefixed are considered equal
        }
    }
});

排序结果:

[
  "es_wl_1_11_test_id",
  "es_wl_1_11_test_edit_date",
  "es_wl_1_11_test_added_date",
  "es_bps_id",
  "es_bps_title",
  "es_department_id",
  "es_department_name",
  "es_designation_id",
  "es_designation_title",
  "es_employment_type_id",
  "es_employment_type_name",
  "es_officer_apply_status",
  "es_officer_dob",
  "es_officer_fname",
  "es_officer_id",
  "es_officer_name",
  "es_service_type_id",
  "es_service_type_name"
]

现在,我想要的是将所有与tablePrefix“es_wl”匹配的项目保留在最上面。但同时添加另一个前缀secondaryPrefix“es_-officer”,以便所有匹配的项目都紧跟在“es_-wl”项目之后,然后按照通常的字母顺序排序。

我已经看了几个项目,并应用它,但项目甚至没有从他们的位置移动。我想我的逻辑是完全错误的,集成第二个前缀,保留第一个前缀,然后进行排序。

共有2个答案

宫俊才
2023-03-14

您可以使用正则表达式来完成它。将数组变成字符串,搜索前缀的单词:

var str = columns.toString(); // Array to string
var prefix = "es_wl";
var regex = new RegExp(prefix + "[\\w]+,", "g"); // Word with the prefix
var res = str.match(regex).sort(); // The array with the words that starts with the desired prefix

使用多个前缀,您可以将它们放在一个数组中。遍历数组,使多个正则表达式,并将排序的数组放在一起。之后,删除字符串中带有所需前缀的单词,替换():

str = str.replace(regex, "");

总计:

columns = [
  "es_officer_name",
  "es_officer_fname",
  "es_officer_apply_status",
  "es_officer_dob",
  "es_wl_1_11_test_id",
  "es_officer_id",
  "es_designation_id",
  "es_wl_1_11_test_edit_date",
  "es_designation_title",
  "es_employment_type_id",
  "es_employment_type_name",
  "es_service_type_id",
  "es_service_type_name",
  "es_wl_1_11_test_added_date",
  "es_bps_id",
  "es_bps_title",
  "es_department_id",
  "es_department_name"
];

var prefix1 = "es_wl";
var prefix2 = "es_officer";
var prefix3 = "es_department";

var prefixes1 = [prefix1, prefix2];
var prefixes2 = [prefix2, prefix1, prefix3];

function makeCustomOrder(prefixes, arr) {
  var str = columns.toString();
  var res = [];
  prefixes.forEach((pre, i) => {
    var regex = new RegExp(pre + "[\\w]+,", "g");
    res = res.concat(str.match(regex).sort());
    str = str.replace(regex, ""); // Delete the words with the desired prefixes
  });

  res = res.concat(str.split(",").sort()); // Put the sorted rest to the result
  return res;
}

var res = makeCustomOrder(prefixes1, columns);
var res2 = makeCustomOrder(prefixes2, columns);
console.log(res); // Example 1
console.log(res2); // Example 2
卜方伟
2023-03-14

完成后,运行代码段。

var columns = [
  "es_officer_name",
  "es_officer_fname",
  "es_officer_apply_status",
  "es_officer_dob",
  "es_wl_1_11_test_id",
  "es_officer_id",
  "es_designation_id",
  "es_wl_1_11_test_edit_date",
  "es_designation_title",
  "es_employment_type_id",
  "es_employment_type_name",
  "es_service_type_id",
  "es_service_type_name",
  "es_wl_1_11_test_added_date",
  "es_bps_id",
  "es_bps_title",
  "es_department_id",
  "es_department_name"
];
var tablePrefix = "es_wl";
var secondTablePrefix = "es_officer"
columns.sort((function(firstPattern, SecondPattern) {
  this.sorting = function(a, b, tablePrefix1, primarySort) {
    if (a.indexOf(tablePrefix1) != -1) {
      if (b.indexOf(tablePrefix1) != -1) {
        return a.localeCompare(b);
      } else {
        return -1;
      }
    } else if (b.indexOf(tablePrefix1) != -1) {
      return 1;
    } else {
      return primarySort ? 0 : a.localeCompare(b); // All prefixed are considered equal
    }
  }
  return function(a, b) {
    var result = sorting(a, b, firstPattern, 1);
    if (result == 0) {
      result = sorting(a, b, SecondPattern, 0);
    }
    return result;
  }
})(tablePrefix, secondTablePrefix));

console.log(columns)
 类似资料:
  • 挑战任务 初始文件index-start.html中提供了一个无序列表元素,并在script标签中提供了一个字符串数组。请为这些字符串排序,要求去除字符串中的The,A以及An的前缀后再进行排序,并把排序后的结果作为列表项展示在无序列表中。 实现效果 基本思路 1.基本的编程任务有两个要点,即排序和展示; 2.数组排序部分最外层即为Array.sort(arr)函数,内层实现具体排序规则; 3.展

  • 问题内容: 我有一个带有数字值的字符串键数组,可用于具有每个标签出现次数的标签列表中,因此: 这是为了我可以按降序显示标签列表,因此: 我可以使用 arsort 通过出色的值进行反向排序,但是我还希望具有相同数字值的所有标签都按字母顺序排序,因此最终结果可以是: 有办法可以做到吗?我猜想 usort 可能是要走的路,但是我看了php.net上的示例,我的眼睛呆呆了!非常感谢!!! 问题答案: 看一

  • 问题内容: 我有一个形状为(N,2)的2D numpy数组,其中包含N个点(x和y坐标)。例如: 我想对它进行排序,以使我的点按x坐标排序,然后在x坐标相同的情况下按y排序。因此,上面的数组应如下所示: 如果这是正常的Python列表,我将简单地定义一个比较器来执行我想要的操作,但是据我所知,numpy的sort函数不接受用户定义的比较器。有任何想法吗? 编辑:感谢您的想法!我建立了一个具有100

  • 问题内容: 我有一个列表,其中每个元素都是形式。例如,列表的元素可能看起来像这样。 我想通过以下条件对包含描述的元素类型的列表进行排序: 如果两个元素的整数列表(即)的长度不同,则整数列表较小的元素是较小的元素。 否则,如果整数列表的长度相同,则较小的元素是第一个整数的较小整数,这两个元素的整数列表都不同。例如: [[1,1,99,100],-1] <[[1,1,100,1],-1],因为99 <

  • 如何搜索前面有数字值的排序arraylist,计划是我要用最大到最小的数字对listview进行排序

  • 我在Java中有一个数组,其中包含一组随机日期: {2015年1月20日、2015年2月12日、2015年2月20日、2015年6月21日、2015年7月12日、2015年7月28日、2015年7月30日、2015年9月24日、2015年12月31日} 如何按月将此阵列拆分为多个阵列? 我想要 {2015年1月20日}、{2015年2月12日、2015年2月20日}、{2015年6月21日}、{2