javascript数组排序的问题
浏览:3007次 出处信息
看看下面的代码,你觉得输出是什么呢?
1 2 3 |
var a = [30,2,1,9,15]; a.sort(); alert(a); |
如果你觉得输出是1,2,9,15,30,那就错了,真正的结果是1,15,2,30,9。不过,在没真正搞清楚javascript的数组排序之前还是先别放弃这个强大的语言。
那么这是怎么回事呢?当排序的方法没有参数的时候,所有的值都会被转化成为字符串,然后根据字典顺序排序。所以15会排在2前面,10和19999也一样。
为了解决这个问题,我们需要给sort()方法传递一个比较函数,这个函数需要两个参数,我们暂且命名为a和b,然后返回:
最简单的数字比较的函数如下:
1 2 3 |
function compare(a,b){ return a-b; } |
我们可以直接把比较函数写在sort里面作为参数传入:
1 2 3 |
var a = [30,2,1,9,15]; a.sort(function(a,b) { return a-b; }); alert(a); |
现在的结果就是1,2,9,15,30了
排序函数另外一个强大的地方在于,他可以比较任何类型的对象的任何属性。我们看看下面的例子:
1 2 3 4 5 6 7 8 |
// location co-ordinates var locations = [ { name: "shops", x:3, y:4 }, { name: "library", x:5, y:3 }, { name: "pub", x:1, y:2 } ]; // home co-ordinates var home = { name: "home", x:0, y:0 }; |
然后我们定义一个公式来比较:
1 2 3 |
function distance(p1,p2){ return Math.sqrt(Math.pow(p1.x-p2.x,2)+Math.pow(p1.y-p2.y,2)); } |
现在我们就可以根据离家距离来排序了。
1 2 3 4 5 6 |
locations.sort( function(a, b) { return distance(home,a)-distance(home,b); } ); // locations sorted: pub, shops, library |
或者也可以由远到近的距离排序。
1 2 3 4 5 6 |
locations.sort( function(b, a) { return distance(home,a)-distance(home,b); } ); // locations sorted: pub, shops, library |
或者根据字母顺序来对地点排序。
1 2 3 4 5 6 7 8 |
locations.sort( function(a, b) { if (a.name < b.name) return -1; if (a.name > b.name) return 1; return 0; } ); // locations sorted: library, pub, shops |
基于javascript的数组排序,我们可以很容易的开发出可以重复使用、可用于任何对象、对象属性的排序方法。从这点上来说,javascript的排序比其他语言的更加灵活。
建议继续学习:
- 如何使用1M的内存排序100万个8位数 (阅读:11003)
- 快速排序(Quicksort)的Javascript实现 (阅读:10149)
- 腾讯-1亿个数据取前1万大的整数-题解答 (阅读:9088)
- 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序) (阅读:6256)
- 深入浅出交换类排序算法(冒泡排序,快速排序) (阅读:6052)
- 为什么数组标号是从0开始的? (阅读:5049)
- C语言结构体里的成员数组和指针 (阅读:4972)
- 将数组定义为常量 (阅读:4628)
- Java程序员必知的8大排序算法 (阅读:4539)
- Mysql中的排序优化 (阅读:4418)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:排序算法 Sleep Sort
后一篇:漫话中文分词算法 >>
文章信息
- 作者:RockUX 来源: RockUX | WEB、前端、JavaScript、PHP
- 标签: 排序 数组
- 发布时间:2011-06-23 13:42:28
建议继续学习
近3天十大热文
- [71] IOS安全–浅谈关于IOS加固的几种方法
- [70] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [63] Go Reflect 性能
- [63] android 开发入门
- [62] find命令的一点注意事项
- [60] 流程管理与用户研究
- [59] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [59] 读书笔记-壹百度:百度十年千倍的29条法则