var array = ['四年级10','四年级1','四年级12','四年级15','四年级3','三年级10','三年级1','三年级12','三年级15','三年级3','三年级10','三年级10','一年级10', '二年级2', '一年级2', '二年级10'];
array.sort(function(x, y){
if(x.match(/\D/g).join("") > y.match(/\D/g).join("")){
return 1;
}else if(x.match(/\D/g).join("") < y.match(/\D/g).join("")){
return -1
}else {
return 0;
}
});
console.log(array);
array.sort(function(x, y){
if(x.match(/\D/g).join("") != y.match(/\D/g).join("")) return;
return parseInt(x.match(/\d/g).join("")) - parseInt(y.match(/\d/g).join(""));
});
console.log(array);
这样的一个排序,目的很明显;但是第二次sort时,数组明显发生了变化,不是第一次sort的顺序了;
如果array的个数很少,四个的话,会有效果,但是数目已增加,就会乱了。为什么第二次sort时,会乱序;
哪位大牛给指点指点,或者还有更好的对这种array的排序方法?
if(x.match(/\D/g).join("") != y.match(/\D/g).join("")) return;
这个条件成立的时候, 没有返回值, 没有返回值, js 就不知道它的大小了, 所以位置就....
而且完全没必要进行两次sort
一次就可以了.
var array = ['四年级10', '四年级1', '四年级12', '四年级15', '四年级3', '三年级10', '三年级1', '三年级12', '三年级15', '三年级3', '三年级10', '三年级10', '一年级10', '二年级2', '一年级2', '二年级10'];
var KEYS = {
'一':1,
'二':2,
'三':3,
'四':4
};
array.sort(function(x, y) {
//得到班级名
var c = x.match(/\D/).join(""),
d = y.match(/\D/).join("");
if(c === d){//班级名相同
//得到具体的班
var e = x.match(/\d+/).join(""),
f = y.match(/\d+/).join("");
return e - f;
}
return KEYS[c] > KEYS[d] ? 1 : -1;
});
console.log('二' > '三');
console.log(JSON.stringify(array));
运行结果:
true
["一年级2","一年级10","二年级2","二年级10","三年级1","三年级3","三年级10","三年级10","三年级10","三年级12","三年级15","四年级1","四年级3","四年级10","四年级12","四年级15"]
因为在进行比较的时候, 汉字 '二' > '三'
, 所以 需要用另外的数据来做为辅助, 以便给它们正确的顺序, 否则 三年级
的数据 会排在 二年级
的前面.
另外你的代码中 在匹配数字的时候, 只匹配一位数字, 产生的问题是的 三年级3
在 三年级10
的后面, 因为代码里只比较了 3
和 1
.