【问题标题】:Sort JavaScript array with mixed characters使用混合字符对 JavaScript 数组进行排序
【发布时间】:2015-10-14 05:01:27
【问题描述】:

我正在尝试将一组名称按从小到大的顺序进行排序。不幸的是,JavaScript 的 .sort() 不起作用,因为它包含下划线和字母。

我有这个代码:

var array = new Array("S1_FORM", "S2_FORM", "S3_2_FORM", "S3_FORM", "S3_3_FORM", "S4_FORM");
var SortedArray = array.sort();

这应该像这样排序:

S1_FORM, S2_FORM, S3_FORM, S3_2_FORM, S3_3_FORM, S4_FORM

这是jsdfiddle

【问题讨论】:

  • 我不确定你想要什么排序规则。 3_2 代表 3.2 吗?会有3_10吗?会在 3_1 之前或之后订购吗?
  • 不,剥离_ 无济于事。相反,您似乎希望在字母 (F) 之后对数字 (2, 3) 进行排序。看看Sort Array Elements (string with numbers), natural sort,你会如何做到这一点。
  • 是的,我只想根据数字进行排序。 1、2、3、3_2、3_3
  • @Bergi 是的,我只是注意到剥离 _ 只会让情况变得更糟。它更像是 3、3.1、3.2 等。

标签: javascript arrays sorting


【解决方案1】:

您的排序有点棘手,因为 _FORM 使它不再是简单的字典排序。

试试这个:

var SortedArray = array.sort(function(a, b){
                    a = a.slice(0, -5);
                    b = b.slice(0, -5); 
                    return a < b ? -1 : (a > b) ? 1 : 0;
                  });

【讨论】:

    【解决方案2】:

    我相信你想要一个自定义的排序比较功能。看到这个帖子: How to define custom sort function in javascript?

    【讨论】:

    • 如果您在此处用自己的话解释博客中的内容,那就太好了。
    【解决方案3】:

    正如 SHIELDHEAD 所建议的,当您想要按照与默认字母/序数规则不同的规则进行排序时,可以将自定义比较器函数传递给 Array.sort()。

    比较器函数的格式如下:

    function(a,b){
         // if a should be before b, return -1
         // if b should be before a, return 1
         // if they are equal, return 0
         return a < b ? -1 : a > b ? 1 : 0;
    }
    

    在您的情况下,我相信您的比较器函数需要做的是获取字符串中“S”和“F”之间的子字符串并进行比较。

    您可以使用正则表达式获取该子字符串:a = a.match(/(?!S)([0123456789_])+(?!F)/g);

    这是工作代码:

    var array = new Array("S1_FORM", "S2_FORM", "S3_2_FORM", "S3_FORM", "S3_3_FORM", "S4_FORM");
    array.sort(function(a,b){
    	a = a.match(/(?!S)([0123456789_])+(?!F)/g);
    	b = b.match(/(?!S)([0123456789_])+(?!F)/g);
    	return a < b ? -1 : a === b ? 0 : 1;
    });
    document.getElementById("output").innerHTML = JSON.stringify(array);
    &lt;div id="output"/&gt;

    编辑:还要注意sort() 函数更改原始数组,因此您不需要创建单独的变量来存储排序后的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多