【问题标题】:Sorting array by multiple prefixes按多个前缀对数组进行排序
【发布时间】:2016-10-22 22:01:13
【问题描述】:

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

我想要达到的目标:

1: 数组项匹配最顶部的tableprefix // 已经实现

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”项目之后,然后是通常的字母排序。

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

【问题讨论】:

    标签: javascript sorting


    【解决方案1】:

    到这里就搞定了,运行sn-p。

    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)

    注意:您的排序代码有问题 - 看看es_officer 的排序,它不是按字母顺序排列的,我觉得这应该是必需的。以上都是在sn-p中完成的。

    更新

    要获得顶部的id 列,

    var columns = [
      "es_officer_name",
      "es_officer_fname",
      "es_officer_apply_status",
      "es_officer_dob",
      "es_officer_id",
      "es_designation_id",
      "es_wl_1_11_test_edit_date",
      "es_designation_title",
      "es_employment_type_id",
      "es_wl_1_11_test_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.indexOf("_id") != -1 ? -1 : b.indexOf("id") != -1 ? 1 : 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 == "retainIt" ? 0 : result;
      }
    })(tablePrefix, secondTablePrefix));
    
    console.log(columns)

    【讨论】:

    • 谢谢,它确实在对两个前缀进行排序,但它没有做第三项工作,按字母顺序对其余项目进行排序
    • 对不起,一开始我把剩下的元素看了一遍。 ;)
    • 我不知道为什么,但由于某种原因,每次我运行它时,订单都会改变
    • 在我的浏览器中,它的顺序很好且正确,您可以清除缓存并重试还是以隐身模式打开它然后尝试。我看到正确的顺序,我在 chrome for mac 上运行它。
    【解决方案2】:

    您可以使用regular expression 来完成。将数组变成字符串,搜索带前缀的单词:

    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
    

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

    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

    compact函数makeCustomOrder()好处是您可以使用带有前缀数组 随心所欲!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多