当前位置: 首页 > 图文教程 > 网络编程 > Javascript > 深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法

Javascript
用jQuery解决IE不支持的option disable属性
jQuery 源代码显示控件 (Ajax加载方式).
JS backgroundImage控制
jQuery 性能优化指南 (1)
jQuery 性能优化指南(2)
jQuery 性能优化指南(3)
input+select(multiple) 实现下拉框输入值
javascript getBoundingClientRect() 来获取页面元素的位置的代码[修正版]
jQuery 图像裁剪插件Jcrop的简单使用
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
jquery(1.3.2) 斑马线效果代码
JQuery Jcrop 实现图片裁剪的插件
jquery img src 获取实现代码
javascript 历史记录 经常用于产品最近历史浏览
jquery tabs的实现代码
jQuery 剧场版 你必须知道的javascript
JavaScript 闭包深入理解(closure)
js 图片缩放(按比例)控制代码
广告切换效果(缓动切换)
javascript 用局部变量来代替全局变量

Javascript 中的 深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 320 ::
收藏到网摘: n/a

Array.prototype.sort方法是对数组进行排序, 该方法带一个函数参数,用来指定排序的规则.
我们先来看看sort 的简单应用:

var arr=[2,1,3,4];
alert(arr.sort()) // [1,2,3,4] 从小到大排列
//现在由大到小排列 得到 [4,3,2,1]
alert(arr.sort(function(left,right){return left>right?-1:1}))
//这里,sort方法通过参数函数的返回值 1或者-1来决定是顺排还是倒排
还记得我以前和大家说过的 利用 Function.apply 方法来获取数组中的最大元素的方法吗?
文中用了两种不同的方法来获取数组中的最大值.
现在 sort也可以来秀一下了.
var arr=[2,1,3,4];
var minValue=arr.sort()[0];
var maxValue=arr.sort()[arr.length-1] // arr.sort().pop()
怎么样,这也是一种另类实现方法吧,还不用写循环遍历.
不过,我必须要指出的是,这种方法的效率是最低的,对于几十个百来个元素的数组,你还是可以使用这种技巧.
但是,如果数组很大,用 sort()方法可以慢得让你想抽烟
进一步讨论 sort 对复杂数据结构的排序.
1. 对多维数组的排序

var arr=[
[2,1,55,4],
[5,3,22,3],
[1,2,77,2],
[9,4,33,5],
];
alert("默认按第一列排\n"+arr.sort().join("\n"))
alert("现在按第三列排\n"+arr.sort(function(left,right){return left[2]>right[2]?1:-1}).join("\n"))
alert("现在按第三列倒排\n"+arr.sort(function(left,right){return left[2]>right[2]?-1:1}).join("\n"))
2.对复杂数据结构的排序
Array.prototype.each=function(f){for(var i=0;i<this.length;i++) f(this[i],i,this)}
function showName(item){alert(item.name)}; //打印名字
var arr=[
{name:"bill",money:500},
{name:"go_rush",money:400},
{name:"dudu",money:9000}
];
//依次显示 dudu,bill,go_rush 看来dudu是最有钱的,而我是最穷的
arr.sort(function(left,right){return left.money>right.money?-1:1}).each(showName)
3.对表格的排序,这个话题我昨天和大家聊过了.
参见:
http://www.cnblogs.com/ashun/archive/2006/11/30/appendChild_table_sort.html
更复杂的表格排序(也是用Array的sort函数):
http://community.csdn.net/expert/Topicview2.asp?id=5174915

4. Protype.js 中对 sort有一个构思非常巧妙的扩展,先看他的代码
1 sortBy: function(iterator) {
2 return this.collect(function(value, index) {
3 return {value: value, criteria: iterator(value, index)};
4 }).sort(function(left, right) {
5 var a = left.criteria, b = right.criteria;
6 return a < b ? -1 : a > b ? 1 : 0;
7 }).pluck('value');
8 },

这个 sortBy 允许传入一个函数, 并把数组的每一个元素作为参数执行该函数,最后对函数返回的结果排序.
下面我来分解他的这个函数.
collect方法实际就是 map方法.相当于
Array.prototype.map=function(f){
for(var i=0;ret=[];i<this.length;i++) ret[i]=f(this[i],i,this)
return ret
}
比如,现在
arr=[2,1,4,3]
iterator=function(x){return x*x}
1-3行代码就得到了这样一个数组
[
{value:2,criteria:4},
{value:1,criteria:1},
{value:4,criteria:16},
{value:3,criteria:9}
]
4-6行代码就对数组按 criteria:进行排序,由小到大.排完得到
[
{value:1,criteria:1},
{value:2,criteria:4},
{value:3,criteria:9},
{value:4,criteria:16}
]
第7行代码最简单了,取每个元素的value属性,最终得到 [1,2,3,4] 实现对arr的sortBy(function...)排序

可能我的语言表达能力有限啊,说prototype.js 的 sortBy的时候硬是不知怎么用文字表达为好.
害得大家那么辛苦看我写的解说代码,实在是不好意思!