Array.sort()默认都是进行字符串比较,哪怕是数字也会先转换成字符串,然后一个字符一个字符的比较。
const arr = [1, 2, 3 ,10, 12]
console.log(arr.sort()); // [1, 10, 12, 2, 3]
比较数字
// 定义一个compare传入sort中
const compare1 = function(val1, val2){
return val1 - val2
}
console.log(arr.sort(compare1)); // [1, 2, 3, 10, 12]
// 也可以用箭头函数
const compare2 = (val1, val2) => {return val2 - val1}
console.log(arr.sort(compare2)); // [12, 10, 3, 2, 1]
// 返回负值是升序。 记忆方法,不代表真实原理:val1 < val2 返回负值,false,不需要进行swap操作。
比较对象
// 一个compare生成器,传入需要比较的属性名
function createComparisonFunction(propertyName){
return function(obj1, obj2){
var value1 = obj1[propertyName];
var value2 = obj2[propertyName];
// 这里也可以直接用value1 - value2 , 此代码为书本源代码
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}
}
const compare3 = createComparisonFunction('age'); // 注意传入字符串
function person(age){
this.age = age;
}
const p1 = new person(11);
const p2 = new person(2);
const p3 = new person(33);
const arr = [p1, p2, p3];
console.log(arr.sort(compare));