一、默认数组排序
var arr = [1,8,5,4,9]
arr.sort()
console.log(arr) //[1,4,5,8,9]
var arr2 = [1,4,2,11,21,6,8]
arr2.sort()
console.log(arr2) //[1,11,2,21,4,6,8]
var arr3 = ['a','B','b','A']
arr3.sort()
console.log(arr3) //['A','B','a','b']
由上可以看出sort()默认是将数组中的元素按ASCII码值进行由小到大排序
如果要正常的从小到大排序,可以在sort()参数中写一个比较函数
var arr = [2,4,5,23,31,7]
//比较函数
var fun = function(x,y){
if(x<y){
return -1
} else if(x>y){
return 1
} else {
return 0
}
}
console.log(arr.sort(fun))//[2,4,5,7,23,31]
//从大到小
var fun2 = function(x,y){
if(x<y){
return 1
} else if(x>y){
return -1
} else {
return 0
}
}
console.log(arr.sort(fun2))//[31,23,7,5,4,2]
二、数组对象排序
如果数组元项是对象,就需要根据数组项的某个属性进行比较排序
var arr = [{name:"aaa", age:11},{name:"bbb", age:15}]
var compare = function (obj1, obj2) {
var val1 = obj1.name //指定属性比较
var val2 = obj2.name
if (val1 < val2) {
return -1
} else if (val1 > val2) {
return 1
} else {
return 0
}
}
console.log(arr.sort(compare))
// [{name:"bbb", age:15},{name:"aaa", age:11}]
// 传入指定属性进行比较
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
}
}
console.log(arr.sort(compare("age")))
// [{name:"bbb", age:15},{name:"aaa", age:11}]
遇到一种情况如:数组是[{name:'aaa',age:21},{name:'ccc',age:5},{name:'bbb',age:32}],但输出结果为:[{name:'ccc',age:5},{name:'bbb',age:32},{name:'aaa',age:21}]
这按从大到小的排序来看是出现了混乱,但实质上是因为传进来的属性是string类型,那么排序就会使用ASCII码进行比较,解决这种情况只需要把类型转化为number类型就可以了
var arr=[{name:'aaa',age:21},{name:'bbb',age:32},{name:'ccc',age:5}]
// 加入类型转换
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
}
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
}
}
console.log(arr.sort(compare('age')))
// [{name:'bbb',age:32},{name:'aaa',age:21},{name:'ccc',age:5}]
此文是因为自己记性不太好经常忘记一下js数组方法的使用,方便查找使用