我正在尝试以特定方式对数组进行排序,并且我正在尝试有效地执行此操作,最好使用.sort()函数。以下是我需要使用的数组类型的示例:
["10", "11", "12", "13", "2", "3", "4", "5", "6", "7", "8", "9", "2a", "2s", "3a"]
这是我在排序后寻找的东西:
["13", "12", "11", "10", "9", "8", "7", "6", "5", "4", "3", "3a", "2s", "2", "2a"]
规则:
按降序排序整数值。附加“a”的整数值较小。附加“s”的整数具有更大的值。因此,2a将在2和1之间,2s将在3和2之间.3a将大于2s。
请帮忙!
答案 0 :(得分:2)
以下是使用javascript .sort()
函数的方法。由于你想允许“2a”和“2s”,我假设所有输入都是字符串。
此处的演示演示:http://jsfiddle.net/jfriend00/NDbcC/
var input = ["10", "11", "12", "13", "2", "3", "4", "5", "6", "7", "8", "9", "2a", "2s", "3a"];
var suffix = {"s": 1, "a": -1,
"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0,
"6": 0, "7": 0, "8": 0, "9": 0};
input.sort(function(a, b) {
var numA = parseInt(a, 10), numB = parseInt(b, 10);
if (numA == numB) {
numB = suffix[b.charAt(b.length - 1)];
numA = suffix[a.charAt(a.length - 1)];
}
return(numB - numA);
});
//output is:
// ["13", "12", "11", "10", "9", "8", "7", "6", "5", "4", "3", "3a", "2s", "2", "2a"]
答案 1 :(得分:1)
基本上,您需要解析数字并对其进行比较,如果后续字符为“a”则加1,如果后续字符为“s”则加1(因为它是反向排序)。
这就是我提出的,它将适用于所有字符串的数组或具有混合字符串和数字的数组:
var weirdSort = (function () {
var chr = String.prototype.charAt,
add = {a:1, s:-1};
return function (a, b) {
var intA = parseInt(a), intB = parseInt(b);
if (intA === intB) {
if (isNaN(a))
intB = intA + add[chr.call(a, 1)];
if (isNaN(b))
intA = intB + add[chr.call(b, 1)];
}
return intB - intA;
}
})();
[10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9, "2a", "2s", "3a"].sort(weirdSort);
//-> [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, "3a", "2s", 2, "2a"]
可能有一种更简单的方法,但我认为我的大脑可以免于凌晨1点不能满负荷工作。