javascript中sort()排序的一些理解

sort()方法对一个数组进行排序,并可以接受一个比较函数,最后返回一个排序的数组。

1.sort()有自身默认的比较函数,该函数把排序的元素都看作字符串。

var s = [5, 4, 3, 2, 1];
s.sort();
console.log(s);
//=>[ 1, 2, 3, 4, 5 ]

改变排序数组:

var s = [2, 4, 5, 1, 12, 3, 13];
s.sort();
console.log(s);
//=>[ 1, 12, 13, 2, 3, 4, 5 ]

 

明显地,大多数情况下sort()方法不能得到理想排序的数组。但是,可以通过为sort()方法传入不同的比较函数,以得到合适的排序结果。

2.为sort()方法传入新的比较函数。

var s = [2, 4, 5, 1, 12, 3, 13];
s.sort(function(a, b) {
    return a - b;
});
console.log(s);
//=>[ 1, 2, 3, 4, 5, 12, 13 ]

其中,比较函数接受两个参数a,b。当比较函数返回0时,表示a=b;返回正数时,表示a>b;返回负数时,表示a<b。

当然,以下方式也有相同的效果:

var s = [2, 4, 5, 1, 12, 3, 13];
s.sort(function(a, b) {
    if(a == b)
        return 0;
    else 
        return a < b ? -1 : 1;
});
console.log(s);
//=>[ 1, 2, 3, 4, 5, 12, 13 ]

再次改变排序数组,其包含不止一种数据:

var s = [2, 4, 5, 'b', 1, 'a', 12, 3, 13];
s.sort(function(a, b) {
    return a - b;
});
console.log(s);
//=>[ 2, 4, 5, 'b', 1, 'a', 3, 12, 13 ]

数组再次变得杂乱无章,因此,可以再修改比较函数,以达到预期效果。

3.使sort()适用于简单数据类型的数组排序。

var s = [2, 4, 5, 'b', 1, 'a', 12, 3, 13];
s.sort(function(a, b) {
    if(a === b)
        return 0;
    if(typeof a === typeof b)         //当数据类型相同时,判断先后位置
        return a < b ? -1 : 1; 
    return typeof a < typeof b ? -1 : 1;  //确定不同类型数据的先后顺序,此例为Number在前,String在后
});
console.log(s);
//=>[ 1, 2, 3, 4, 5, 12, 13, 'a', 'b' ]

由本例可知,可先对传入参数进行类型判断,再进行排序,即可以得到一定排序方式的结果。

同样地,通过比较函数,我们可以对对象数组进行排序。

4.用sort()方法排序对象数组

 1 var s = [
 2     {'year': 1993, 'sex': 'man', 'name': '张三'},
 3     {'year': 1992, 'sex': 'woman', 'name': '李红'},
 4     {'year': 1991, 'sex': 'man', 'name': '赵四'},
 5     {'year': 1993, 'sex': 'woman', 'name': '吴用'}
 6 ];
 7 var byRule = function(rule) {
 8     return function(a, b) {
 9         var i, j;
10         if(typeof a === 'object' && typeof b === 'object') {
11             i = a[rule];
12             j = b[rule];
13             if(i === j)
14                 return 0;
15             if(typeof i === typeof j) {
16                 return i < j ? -1 : 1;
17             }
18             return typeof i < typeof j ? -1 : 1;
19         }
20     };
21 };
22 s.sort(byRule('year'));
23 console.log(s);
24 //=>[ { year: 1991, sex: 'man', name: '赵四' },
25       { year: 1992, sex: 'woman', name: '李红' },
26       { year: 1993, sex: 'man', name: '张三' },
27       { year: 1993, sex: 'woman', name: '吴用' } ]

先定义了一个函数byRule,该函数返回一个排序函数,从而可以通过传入不同的排序规则至byRule函数来得到不同的排序函数。

观察26,27行代码,其中year相同:

26       { year: 1993, sex: 'man', name: '张三' },
27       { year: 1993, sex: 'woman', name: '吴用' } ]

可以再对byRule函数添加一个参数,使得第一个键值已派序时,对相同的元素进行下一个键值对的排序:

 1 var s = [
 2     {'year': 1993, 'sex': 'man', 'name': '张三'},
 3     {'year': 1992, 'sex': 'woman', 'name': '李红'},
 4     {'year': 1991, 'sex': 'man', 'name': '赵四'},
 5     {'year': 1993, 'sex': 'woman', 'name': '吴用'}
 6 ];
 7 var byRule = function(rule, next) {
 8     return function(a, b) {
 9         var i, j;
10         if(typeof a === 'object' && typeof b === 'object') {
11             i = a[rule];
12             j = b[rule];
13             if(i === j)
14                 return typeof next === 'function' ? next(a, b) : 0 ;  //第一对键值相同时,继续比较第二对键值
15             if(typeof i === typeof j) {
16                 return i < j ? -1 : 1;
17             }
18             return typeof i < typeof j ? -1 : 1;
19         }
20     };
21 };
22 s.sort(byRule('year', byRule('name')));    //byRule函数接受两个参数,第二个参数为一个函数
23 console.log(s);
24 //=>[ { year: 1991, sex: 'man', name: '赵四' },
25       { year: 1992, sex: 'woman', name: '李红' },
26       { year: 1993, sex: 'woman', name: '吴用' },            
27       { year: 1993, sex: 'man', name: '张三' } ]

与上例对比,26,27行的顺序已改变。

5.讨论一下sort()的排序方式。

本例测试在sublime text 3 中进行。

  • 当排序数组元素不大于10个时:
var s = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
s.sort(function(a, b) {
    if(a == b) {
        console.log(a + "=" + b);
        return 0;
    }
    if(a < b) {
        console.log(a + "<" + b);
        return -1;
    }
    if(a > b) {
        console.log(a + ">" + b);
        return 1;
    }
});
console.log(s);

结果:

10>9
10>8
9>8
10>7
9>7
8>7
10>6
9>6
8>6
7>6
10>5
9>5
8>5
7>5
6>5
10>4
9>4
8>4
7>4
6>4
5>4
10>3
9>3
8>3
7>3
6>3
5>3
4>3
10>2
9>2
8>2
7>2
6>2
5>2
4>2
3>2
10>1
9>1
8>1
7>1
6>1
5>1
4>1
3>1
2>1
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

 

可见,其排序方式为典型的插入排序

  • 当排序数组元素为11个(或11个以上)时:
var s = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
s.sort(function(a, b) {
    if(a == b) {
        console.log(a + "=" + b);
        return 0;
    }
    if(a < b) {
        console.log(a + "<" + b);
        return -1;
    }
    if(a > b) {
        console.log(a + ">" + b);
        return 1;
    }
});
console.log(s);

结果:

11>1
1<6
11>6
9>6
2<6
8>6
3<6
7>6
4<6
10>6
5<6
1<2
2<3
3<4
4<5
10>7
10>8
7<8
10>9
8<9
10<11
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]

 

可见,其排序方式为快速排序

-------------------------------------------------------------------------------------------------------

注:本文为个人学习随笔,仅供个人学习使用,如有雷同,纯属巧合,敬请原谅!

posted @ 2018-05-22 14:13  黎志文  阅读(582)  评论(0编辑  收藏  举报