主要代码:
/**
*@description: 比较两个字符串大小
*@author: JackieZheng
*@date: 2020-12-03 19:59:39
*/
function compare(a, b) {if (a == b) {return 0;} else {let lsta = a.toString().replace(/[一二三四五六七八九十百千万亿]+/g, ChineseToNumber).split(/(\d+)/);let lstb = b.toString().replace(/[一二三四五六七八九十百千万亿]+/g, ChineseToNumber).split(/(\d+)/);let l = Math.max(lsta.length, lstb.length);for (i = 0; i < l; i++) {if (lsta[i] != lstb[i]) {if (isNaN(lsta[i] - lstb[i])) {return lsta[i] > lstb[i] ? 1 : -1;} else {return lsta[i] - lstb[i] > 0 ? 1 : -1;}}}}
}/***@description: 汉字转数字*@author: JackieZheng*@date: 2020-12-03 19:59:39*/
function ChineseToNumber(chnStr) {//目前已知Bug:类如"三千万亿"结果不正确chnStr = chnStr.indexOf("十") == 0 ? "一" + chnStr: chnStr;var chnNumChar = {零: 0,一: 1,二: 2,三: 3,四: 4,五: 5,六: 6,七: 7,八: 8,九: 9,两: 2};var chnNameValue = {十: {value: 10,secUnit: false},百: {value: 100,secUnit: false},千: {value: 1000,secUnit: false},万: {value: 10000,secUnit: true},亿: {value: 100000000,secUnit: true}};var rtn = 0;var section = 0;var number = 0;var unit = 1;var secUnit = false;var str = chnStr.split('');for (var i = 0; i < str.length; i++) {var num = chnNumChar[str[i]];if (typeof num !== 'undefined') {number = num;if (num === 0) {unit = 1;}if (i === str.length - 1) {section += number * unit;}} else {unit = chnNameValue[str[i]].value;secUnit = chnNameValue[str[i]].secUnit;if (secUnit) {section = (section + number) * unit;rtn += section;section = 0;} else {section += (number * unit);}number = 0;unit = unit > 1 ? unit / 10 : unit;}}return rtn + section;
}
测试:
var arr=["学生12","学生1","学生三百五","学生2","学生十五"];arr.sort(compare)----------------------------------------------------------(5) ["学生1", "学生2", "学生12", "学生十五", "学生三百五"]
0: "学生1"
1: "学生2"
2: "学生12"
3: "学生十五"
4: "学生三百五"
length: 5
__proto__: Array(0)