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. ideal key

    常用快捷键 设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“eclipse” -> 然后“Copy”一份 - ...

  2. C# 索引器的使用

    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...

  3. 《火星救援》NASA惊现lisp

    duang-跳出个界面上面一个lisp程序.

  4. 一点点学习的心得-MetroJS

    原文:http://zhangxiaolun.lofter.com/post/217084_73a1a9# 在最近的一个项目中,页面上有一部分由一些图片方块组成,要求说是:“做成类似动画的东东,最好可 ...

  5. 微信小程序开发前期准备

    开发文档 官方开发文档 开发IDE 官方工具下载 UI组件 WeUI:是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,新手建议使用: ZanUI-WeAp ...

  6. velecity报错:Caused by: org.apache.velocity.exception.ParseErrorException: Lexical error, Encountered: <EOF> after : "\'/order/pay?activity=\" + activityId);\r\n }*/\r\n</script>\r\n#end\r\n" at /a

    Caused by: org.apache.velocity.exception.ParseErrorException: Lexical error, Encountered: <EOF> ...

  7. idea maven 依赖问题

    今天发现,原来idea引用maven依赖的时候,优先依赖的是本地.但是有个问题,如果我删除了一个packet,如果刚刚好本地另外一个项目里面也有这个对于的packet,idea的智能提示 是 将其导入 ...

  8. 微信小程序——初始化一个小程序项目

    最近准备学习一下微信小程序,因为之前有react native项目经验,学习起来应该困难不大 微信小程序官网地址:https://mp.weixin.qq.com/debug/wxadoc/dev/i ...

  9. centos aws 修改使用密码ssh登录

    因为使用pem登录有很多局限性,在此修改为用密码但不是root登录 1.关闭selinux(要重启) vi /etc/selinux/config SELINUX=disabled 2.重置root密 ...

  10. SQL Server ->> SQL Server 2016新特性之 -- AlwaysOn的增强改进

    1)标准版也开始支持AlwaysOn了,只不过限制太多,比如副节点不能只读访问和只能有一个副节点. 2)副节点(只读节点)的负载均衡,这是我认为最有用的改进 3)自动failover的节点从2个增加到 ...