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()方法排序对象数组

 var s = [
{'year': 1993, 'sex': 'man', 'name': '张三'},
{'year': 1992, 'sex': 'woman', 'name': '李红'},
{'year': 1991, 'sex': 'man', 'name': '赵四'},
{'year': 1993, 'sex': 'woman', 'name': '吴用'}
];
var byRule = function(rule) {
return function(a, b) {
var i, j;
if(typeof a === 'object' && typeof b === 'object') {
i = a[rule];
j = b[rule];
if(i === j)
return 0;
if(typeof i === typeof j) {
return i < j ? -1 : 1;
}
return typeof i < typeof j ? -1 : 1;
}
};
};
s.sort(byRule('year'));
console.log(s);
//=>[ { year: 1991, sex: 'man', name: '赵四' },
{ year: 1992, sex: 'woman', name: '李红' },
{ year: 1993, sex: 'man', name: '张三' },
{ year: 1993, sex: 'woman', name: '吴用' } ]

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

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

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

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

 var s = [
{'year': 1993, 'sex': 'man', 'name': '张三'},
{'year': 1992, 'sex': 'woman', 'name': '李红'},
{'year': 1991, 'sex': 'man', 'name': '赵四'},
{'year': 1993, 'sex': 'woman', 'name': '吴用'}
];
var byRule = function(rule, next) {
return function(a, b) {
var i, j;
if(typeof a === 'object' && typeof b === 'object') {
i = a[rule];
j = b[rule];
if(i === j)
return typeof next === 'function' ? next(a, b) : 0 ;  //第一对键值相同时,继续比较第二对键值
if(typeof i === typeof j) {
return i < j ? -1 : 1;
}
return typeof i < typeof j ? -1 : 1;
}
};
};
s.sort(byRule('year', byRule('name')));    //byRule函数接受两个参数,第二个参数为一个函数
console.log(s);
//=>[ { year: 1991, sex: 'man', name: '赵四' },
{ year: 1992, sex: 'woman', name: '李红' },
{ year: 1993, sex: 'woman', name: '吴用' },            
{ 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 ]

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

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

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

javascript中sort()排序的一些理解的更多相关文章

  1. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  2. JavaScript中call、apply个人理解

    JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 }; } function personInfo(name,age){ t ...

  3. JavaScript中简单排序总结

    JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...

  4. STL中sort排序算法第三个参数_Compare的实现本质

    关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...

  5. 对JavaScript中变量类型的重新理解

    <JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解 ...

  6. javascript中闭包与作用域的理解

    很多js的框架与插件编写都用到了闭包,所以,阅读和掌握闭包很有必要.最近学习vue框架时,经常会猜想很多功能的native js实现,很多都应用到了闭包,闭包除了目前已知的一些特性,如:可以保持局部变 ...

  7. javascript中对象字面量的理解

    javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...

  8. JavaScript中一些怪异用法的理解

    引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaS ...

  9. javascript 中的new操作符的理解

    new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassic ...

随机推荐

  1. Strapi 安装易错位置

    Strapi官网(https://strapi.io)介绍:最先进的开源内容管理框架,可以毫不费力地构建功能强大的API,建立在Node.js平台之上,为您的API提供高速惊人的表现. 简单点说,(对 ...

  2. Django—Cookie and Session

    一.Cookie Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密). 1. 应用 服务器可以利用Co ...

  3. 服务器端渲染VS浏览器端渲染

    1)浏览器渲染和服务器渲染区别:何为渲染?如果我们只是想显示一堆不变的数据,那么我们直接写一个a.html丢到服务器上让客户端访问就可以了.但这是基本不可能的事情,数据一般是变化的.你不可能为每套数据 ...

  4. IE的兼容性设置 X-UA-Compatible

    < meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" /> 是IE8 ...

  5. android网络监听

    http://blog.csdn.net/mxiaoyem/article/details/50857008 http://blog.csdn.net/ke1vin/article/details/5 ...

  6. Kettle数据抽取解决方案

    一. Kettle介绍 1. Kettle简介 ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.Kettle的中文翻译为水壶.Kettle以元数据驱动的方式提供 ...

  7. MYSQL连接相关参数和状态值详解

    针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...

  8. [原]Linux 命令行 发送邮件

    1.mail -s hi xx@yy.com 给xx@yy.com发一封主题为hi的信(没有正文) 编辑完内容后Ctrl-D结束. 2.echo "This is a test mail!& ...

  9. Python切片(入门7)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407977.html 本文出自:[Edwin博客园] Python切片 1. 对list进行切片 L = r ...

  10. django 静态文件

    django 1.8版本以上 django 静态文件配置. 小作之前, 一直觉得django的静态文件配置非常的麻烦. 1. 要设置url(r'^static/(?P<path>.*)&a ...