在之前算法学习的时候,常用到sort,印象中sort是按照转化unicode进行排序的。
学习一下sort()吧
const arr = [
{ name: "小红", subject: "语文", age: 16, score: "90", rank: "一" },
{ name: "小黄", subject: "数学", age: 18, score: "70", rank: "七" },
{ name: "小蓝", subject: "语文", age: 19, score: "60", rank: "六" },
{ name: "小绿", subject: "数学", age: 17, score: "80", rank: "八" },
];
// 以为能够语文能和语文排在一起,其实不能,看看打印什么
arr.sort((a, b) => a.subject - b.subject);
console.log(arr, "arr-subject");
// 实际上,如果按照年龄排序,是可以的
arr.sort((a, b) => a.age - b.age);
console.log(arr, "arr-age");
// 如果是可以转化为数字的字符串呢?注意这里,其实不行,因为是按unicode排序,首位直至末尾,而不是大小排序,10 100 1000 500 60
arr.sort((a, b) => a.score - b.score);
console.log(arr, "arr-score");
const arr2 = ["1000", "500", "10", "100", "60"];
arr2.sort();
console.log(arr2, "arr2");
// 如果是大写中文数字呢,
arr.sort((a, b) => a.rank - b.rank);
console.log(arr, "arr-rank");
打印结果:
从结果看,改变了原数组,呈现结果是这样的
- 字符串中文与字符串中文大写数字不能排序,如:”小明,十”等
- 可以转化为数字的字符串也不可以,如:“'10','2','3'”等,10会排在2、3前
- 数字可以,如:“1,2,3”
如果第一个参数比第二个参数小,比较函数应该返回一个负数,那么第一个参数会被排序到第二个参数之前
如果第一个参数比第二个参数大,比较函数应该返回一个正数,那么第一个参数会被排序到第二个参数之后
sort()可以用在基础数据类型的数组排序,如果是对象里的内容进行排序,则是需要进行两个参数的比较返回正负数的。
如何对中文进行排序呢?
function compare(a, b) {
// 转换为字符数组
if (!a || !b) return 0;
for (let i = 0; i < a.length && i < b.length; i += 1) {
// 比较unicode编码
const unicodeA = a.charCodeAt(i);
const unicodeB = b.charCodeAt(i);
if (unicodeA !== unicodeB) {
return unicodeA - unicodeB;
}
}
// 如果所有字符都相同,则长度短的排在前面
return a.length - b.length;
}
// 使用
list.sort((a, b) => compare(a, b))
以上