使用混合字符对JavaScript数组进行排序

时间:2015-07-23 18:07:57

标签: javascript arrays sorting

我正在尝试将一组名称排序到最小到最大的顺序。不幸的是,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 个答案:

答案 0 :(得分:2)

你的排序有点棘手,因为_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;
                  });

答案 1 :(得分:1)

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

答案 2 :(得分:0)

正如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);
<div id="output"/>

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