我有一个包含字符串的数组,如下所示:
["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"]
我正试图对它们进行排序,如下所示:
["2013-1", "2013-2", "2013-3", "2013-4", "2013-10", "2013-11", "2013-12", "2014-1", "2014-2", "2014-3"]
我已经检查了一些关于这个主题的线程,但没有一个解决方案对我有用。
使用this问题的答案我的数组根本没有改变。
var myArray = ["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"]
myArray.sort(function(a,b) {
if (isNaN(a) || isNaN(b)) {
return a > b ? 1 : -1;
}
return a - b;
});
似乎无法找到一种轻松做到这一点的方法,如何实现它的任何想法?
答案 0 :(得分:2)
问题在于它不仅仅是字符串数组中的数字,每个字符串中有两个数字。有许多可能的approchaes,您可以将值解析为日期,您可以将值解析为两个数字,您可以将值拆分为字符串和数字,等等。
我建议的方法是将每个字符串转换为可进行比较的可排序格式,即将"2013-1"
之类的字符串转换为2013-01
。由于字符串中的每个组件具有相同的长度,并且组件的重要性不断下降,您可以将它们作为字符串进行比较:
myArray.sort(function(a,b) {
var x = a.replace(/(-\d$)/, '-0$1');
var y = b.replace(/(-\d$)/, '-0$1');
return (
x > y ? 1 :
x < y ? -1 :
0
);
});
var myArray = ["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"];
myArray.sort(function(a,b) {
var x = a.replace(/(-\d$)/, '-0$1');
var y = b.replace(/(-\d$)/, '-0$1');
return (
x > y ? 1 :
x < y ? -1 :
0
);
});
// output result in StackOverflow snippet
document.write(JSON.stringify(myArray));
&#13;
答案 1 :(得分:1)
其中一种方法:
myArray.sort(function (a, b) {
a = a.split("-");
b = b.split("-");
var montha = parseInt(a[1]),
monthb = parseInt(b[1]);
a = parseInt(a[0]);
b = parseInt(b[0]);
if (a === b) {
return (montha - monthb);
}
return a - b;
});
答案 2 :(得分:1)
这是一种函数式编程方法:将字符串映射到两个数字的数组,对该数组进行排序(更容易),然后映射回字符串。
var input = ["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"];
var output = input
.map(function (val) {
return val.split("-").map(Number);
})
.sort(function (a, b) {
return a[0] - b[0] || a[1] - b[1];
})
.map(function (val) {
return val.join("-");
});