aardio官方社区

 找回密码
 注册会员

!connect_header_login!

只需一步,快速开始

搜索
查看: 7571|回复: 2

javascript数组排序的问题

[复制链接]

52

主题

1334

帖子

7301

积分

荣誉会员

Rank: 8Rank: 8

积分
7301
发表于 2011-5-23 07:34:01 | 显示全部楼层 |阅读模式
看看下面的代码,你觉得输出是什么呢?
  1. var a = [30,2,1,9,15];
  2. a.sort();
  3. alert(a)
复制代码

如果你觉得输出是1,2,9,15,30,那就错了,真正的结果是1,15,2,30,9。
那么这是怎么回事呢?当排序的方法没有参数的时候,所有的值都会被转化成为字符串,然后根据字典顺序排序。所以15会排在2前面,10和19999也一样。

为了解决这个问题,我们需要给sort()方法传递一个比较函数,这个函数需要两个参数,我们暂且命名为a和b,然后返回:

  • 如果a<b,那么返回一个负数。
  • 如果a>b,那么返回一个正数。
  • 如果a=b,就返回0。

最简单的数字比较的函数如下:
  1. function compare(a,b){
  2.     return a-b;
  3. }
复制代码

我们可以直接把比较函数写在sort里面作为参数传入:
  1. var a = [30,2,1,9,15];
  2. a.sort(function(a,b) { return a-b; });
  3. alert(a)
复制代码

现在的结果就是1,2,9,15,30了

排序函数另外一个强大的地方在于,他可以比较任何类型的对象的任何属性。我们看看下面的例子:
  1. // location co-ordinates
  2. var locations = [
  3.     { name: "shops", x:3, y:4 },
  4.     { name: "library", x:5, y:3 },
  5.     { name: "pub", x:1, y:2 }
  6. ];
  7. // home co-ordinates
  8. var home = { name: "home", x:0, y:0 };
复制代码

然后我们定义一个公式来比较:
  1. function distance(p1,p2){
  2. return Math.sqrt(Math.pow(p1.x-p2.x,2)+Math.pow(p1.y-p2.y,2));
  3. }
复制代码

现在我们就可以根据离家距离来排序了。
  1. locations.sort(
  2.     function(a, b) {
  3.         return distance(home,a)-distance(home,b);
  4.     }
  5. );
  6. // locations sorted: pub, shops, library
复制代码

或者也可以由远到近的距离排序。
  1. locations.sort(
  2.     function(b, a) {
  3.         return distance(home,a)-distance(home,b);
  4.     }
  5. );
  6. // locations sorted: pub, shops, library
复制代码

或者根据字母顺序来对地点排序。
  1. locations.sort(
  2.     function(a, b) {
  3.         if (a.name < b.name) return -1;
  4.         if (a.name > b.name) return 1;
  5.         return 0;
  6.     }
  7. );
  8. // locations sorted: library, pub, shops
复制代码

基于javascript的数组排序,我们可以很容易的开发出可以重复使用、可用于任何对象、对象属性的排序方法。
回复

使用道具 举报

14

主题

67

帖子

386

积分

荣誉会员

Rank: 8Rank: 8

积分
386
发表于 2011-6-20 09:16:00 | 显示全部楼层

终于有排序的方法了,收着学习。

终于有排序的方法了,收着学习。
要有学习目标和计划,多做练习,学好aardio
回复

使用道具 举报

6

主题

63

帖子

387

积分

荣誉会员

Rank: 8Rank: 8

积分
387
发表于 2011-6-20 11:35:06 | 显示全部楼层

{:3_41:} 好好学习


好好学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2021-9-26 23:38 , Processed in 0.070367 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表