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()方法排序对象数组。
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()排序的一些理解的更多相关文章
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- JavaScript中call、apply个人理解
JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 }; } function personInfo(name,age){ t ...
- JavaScript中简单排序总结
JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...
- STL中sort排序算法第三个参数_Compare的实现本质
关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...
- 对JavaScript中变量类型的重新理解
<JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解 ...
- javascript中闭包与作用域的理解
很多js的框架与插件编写都用到了闭包,所以,阅读和掌握闭包很有必要.最近学习vue框架时,经常会猜想很多功能的native js实现,很多都应用到了闭包,闭包除了目前已知的一些特性,如:可以保持局部变 ...
- javascript中对象字面量的理解
javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...
- JavaScript中一些怪异用法的理解
引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaS ...
- javascript 中的new操作符的理解
new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassic ...
随机推荐
- Android TabHost切换选项卡实现数据实时刷新
手机界面大小有限,使用TabHost可以达到在一个Activity中放入多个容器(界面)的效果.但存在一个问题是,当数据信息在一个容器(界面)中有所改变时,需要在用户切换选项卡到其他容器(界面)的时候 ...
- Android通过浏览器打开app页面并且传递值
最近公司有个需求,要求从第三方网页端打开一个网页,然后在网页中点击“下载”,“打开”按钮,在app端进行下载和打开操作.这里记录下方法. 首先,网页和app页面进行交互,其实会很快想到JS交互,但是现 ...
- dubbo学习总结三 消费端
消费端跟服务端类似 注意点是dubbo:reference 和服务端的dubbo:service做区分 消费端主要是处理发送过来的请求
- python mqtt client publish操作
使用Python库paho.mqtt.client 模拟mqtt client 连接broker,publish topic. #-*-coding:utf-8-*- import paho.mqtt ...
- webstorm javascript IDE调试
webstorm是我见过的前端开发调试最好用的IDE工具了,它不仅具有强大的编辑,代码查阅引用功能,更有强大的js调试功能,这是任何通过firebug,chrome devtool,console.l ...
- Oracle案例02——ORA-12034: "SCOTT"."USER_TABLE" 上的实体化视图日志比上次刷新后的内容新
最近同事在交接工作时,发现有几个schedule job没有执行成功,我这边给看了下,其中一个是由于数据库迁移,调用dblink的host主机IP在tnsnames中没有变更导致,还有一个是无法视图的 ...
- (转)从Python的0.1输出0.1000000000000001说浮点数的二进制
原文地址:http://blog.csdn.net/u012843100/article/details/60885763 今天在学习Python核心编程的时候,十进制浮点数那段看到一个有趣的事情. ...
- 远程桌面连接无法验证您希望连接的计算机的身份-mac连接远程桌面
在使用Mac(苹果笔记本)连接远程桌面的时候提示:”远程桌面连接无法验证您希望连接的计算机的身份”,具体异常如截图:解决方法如下:1. 登录云服务器.2. 打开运行,然后输入命令gpedit.msc, ...
- 工作好搭档(三):慧想 S100 液晶显示器支架
引言:工欲善其事,必先利其器.码农十年,与电脑打了二十多年的交道,也配置了一些过得去的装备.资金有限,更希望所有的投入都在刀刃上.写工作好搭档系列,是晒考虑的原因.思路.经验和教训.欢 ...
- Timer类注意事项
Java的一个Timer对象可以执行多个Timertask任务,但是一个Timer对象本身只有一个线程,如果向他提交多个task,并且某个task相当耗时的话,其他的task即使到了执行时间,仍然会等 ...