方法一:sort()
不传参:是按照字符编码的顺序进行排序(如有必要应把数组的元素都转换成字符串)
传参:需要提供比较函数,比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
let arr = ['张三','李四ll','王五ww', '阿狸', '咚咚','1', '2', '3','a', 'b'];
let result = arr.sort();
console.log(result)
打印结果:
方法二:localeCompare()
(stringObject.localeCompare(target))如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。如果 stringObject 大于 target,则该方法返回大于 0 的数。如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。
ocaleCompare() 方法提供的比较字符串的方法,考虑了默认的本地排序规则。
注意:把 < 和 > 运算符应用到字符串时,它们只用字符的 Unicode 编码比较字符串,而不考虑当地的排序规则。以这种方法生成的顺序不一定是正确的。
//本地特定排序规则对字符串数组进行排序
let arr = ['张三','李四ll','王五ww', '阿狸', '咚咚','1', '2', '3','a', 'b'];
let result = arr.sort((a, b)=>{
return a.localeCompare(b)
});
console.log(result)
还需要进一步处理,才能实现需求。
let result = arr.sort((a, b)=>{
let n = !isNaN(a - 0);
let n2 = !isNaN(b - 0);
// 数字优先
if (n && n2) {
return a - b;
} else if (n) {
return -1;
} else if (n2) {
return 1;
}
// 将含有汉字的使用localeCompare排序
let e = escape(a).indexOf("%u") > -1
let e2 = escape(b).indexOf("%u") > -1
//用escape来判断字符串中是否有汉字实际上并不完全准确
//let reg = new RegExp("[\\u4E00-\\u9FFF]+","g")
//let e = reg.test(a);
//let e2 = reg.test(b)
//使用正则后,对于纯汉字的字符排序有些出入,因此暂时不考虑这种方法
if (e && e2) {
return a.localeCompare(b);
} else if (e) {
return 1;
} else if (e2) {
return -1;
}
return a.localeCompare(b);
});
结果同sort()方法一致
//另附上正则判断是否汉字的返回结果
欢迎指出需要改进的地方🎈!