介绍
在我们实际的开发中,我们经常会遇到对数组进行排序的操作,所谓排序,就是使一串记录按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。同时排序也是算法的一种,javascript内置的sort函数是多种排序算法的集合,数组在原数组上进行排序。JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。
简单排序
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单排序</title>
</head>
<body>
<script type="text/javascript">
var numbers=[11,31,22,15,89,32,10];
numbers.sort();//调用数组内置排序方法
console.log(numbers);//[10, 11, 15, 22, 31, 32, 89]
numbers.reverse();//将数组进行反转
console.log(numbers);//[89, 32, 31, 22, 15, 11, 10]
</script>
</body>
</html>
经过上面的操作,看式我们已经达到了目的,但是还是拥有问题,请看下面。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单排序</title>
</head>
<body>
<script type="text/javascript">
var numbers=[11,31,22,15,89,32,100];
numbers.sort();//调用数组内置排序方法
console.log(numbers);//[100, 11, 15, 22, 31, 32, 89]
numbers.reverse();//将数组进行反转
console.log(numbers);//[89, 32, 31, 22, 15, 11, 100]
</script>
</body>
</html>
不知道你们发现问题没有,我们仅仅是将10换成了100,但是100还是排在了最前面,与我们的想法严重不符合。
但是这是为啥呢?本身sort()这个方法是没有问题的,在默认情况下,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值排在最后面。
为了实现升序,sort() 方法会调用每个数组项的toString() 转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。为了更好的实现排序,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于那个值的前面。
简单数组自定义排序
function arrAsc(a, b) { //实现数组升序的方法
if (a > b) {
return 1;
} else if (a < b) {
return -1;
} else {
return 0;
}
}
numbers.sort(arrAsc); //调用数组升序的方法
console.log(numbers); //[11, 15, 22, 31, 32, 89, 100]
function arrDesc(a, b) { //实现数组降序的方法
if (a > b) {
return -1;
} else if (a < b) {
return 1;
} else {
return 0;
}
}
numbers.sort(arrDesc); //调用数组降序的方法
console.log(numbers); //[100, 89, 32, 31, 22, 15, 11]
在这里我们定义了一个compare比较函数,当a>b的结果为整数时则为升序,当a>b的结果为负数时则为降序。
简单对象自定义属性排序
var friuts = [
{
name: 'apple',
price: 18.5,
count: 10
},
{
name: 'pear',
price: 1.5,
count: 5,
},
{
name: 'banana',
price: 20.5,
count: 20
},
]
//未排序前
console.log(JSON.stringify(friuts));//[{"name":"apple","price":18.5,"count":10},{"name":"pear","price":1.5,"count":5},{"name":"banana","price":20.5,"count":20}]
//按价格升序排序
friuts.sort(function (x, y) {
return x.price - y.price;
});
console.log(JSON.stringify(friuts));//[{"name":"pear","price":1.5,"count":5},{"name":"apple","price":18.5,"count":10},{"name":"banana","price":20.5,"count":20}]
//按名称排序
friuts.sort(function (x, y) {
if (x.name > y.name) {
return 1;
} else if (x.name < y.name) {
return -1;
} else {
return 0;
}
});
console.log(JSON.stringify(friuts));//[{"name":"apple","price":18.5,"count":10},{"name":"banana","price":20.5,"count":20},{"name":"pear","price":1.5,"count":5}]
通用的排序方法
var friuts = [
{
name: 'apple',
price: 18.5,
count: 10
},
{
name: 'pear',
price: 1.5,
count: 5,
},
{
name: 'banana',
price: 20.5,
count: 20
},
]
var sortExp = function (key, isAsc) {
return function (x, y) {
if (isNaN(key)) {
if (x[key] > y[key]) {
return 1 * (isAsc ? 1 : -1);
} else if (x[key] < y[key]) {
return -1 * (isAsc ? 1 : -1);
} else {
return 0;
}
} else {
return (x[key] - y[key]) * (isAsc ? 1 : -1)
}
}
}
//价格升序
friuts.sort(sortExp('price', true));
console.log(JSON.stringify(friuts));
//价格降序
friuts.sort(sortExp('price', false));
console.log(JSON.stringify(friuts));
//名称升序
friuts.sort(sortExp('name', true));
console.log(JSON.stringify(friuts));
//名称降序
friuts.sort(sortExp('name', false));
console.log(JSON.stringify(friuts));
//数量升序
friuts.sort(sortExp('count', true));
console.log(JSON.stringify(friuts));
//数量降序
friuts.sort(sortExp('count', false));
console.log(JSON.stringify(friuts));
学习并转载自:www.cnblogs.com/jjgw/