Web常用工具 二维码美化 在线压缩 JavaScript AI工具汇总网站 ASP.NET控件源码查询 W3CHTML W3SCHOOL TypeScript 开源中国 51aspx github codeproject SQLBACKUP 几种排序算法比较 SQL中deny权限 MSDN下载 HttpWebRequest类 HTML5 stackoverflow ASP.NET 页生命周期概述 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 [SQL Server]视图sys.sysprocesses brnshop学习 SQL视频 Fiddler帮助文档 Sprint.Net SQLServer牛人博客 codeplex IIS官网 IE11 Developer Jquery源码视频上 Jquery源码视频下 Jquery Bugs jquery.miaov.com 正则表达式 Jquery API 1.9 Service Broker Javascript Object中的方法讲解 Microsoft webcast 微信开发接口 ECMAScript5 Underscore Jquery Bugs SQL存储过程事务嵌套 官网SQL事务锁 2345天气插件 Json数据查看 C++ jquery-plugin-validate 博学谷(传智播客) Swift视频 IOS代码论坛 SWIFT设计模式 操作系统下载 AngularJS VueJS ASPNETCORE 前端题库 Node.js ASPNETCORE 腾讯课堂 SwiftUI SwiftUI疑问解答 ADO.NET SMO 数字化企业网 Unicode码查询 Redis使用文档 .NET 微服务:适用于容器化 .NET 应用程序的体系结构 .NETCore5.0微软官方文档 CSS3.0 在 ASP.NET Core 中配置 Windows 身份验证 Maven使用教程 Maven Repository Thymeleaf Thymeleaf中文CSDN Spring官方文档 Spring中文文档 SpringBoot SpringData SVG在线设计工具 SVG教程01 SVG教程02 fontawesome图标库 mybatis官网 mybatis-spring中文 mysql教程 python教程 python的scrapy教程01 python的scrapy教程02 VS开发python xpath教程 腾讯向量数据库教程 JSZip浏览器内存中创建文件与文件夹 axios的使用文档 SheetJS(JS操作excel)的使用文档 金蝶云星空学习成长

huaan011

 

javascript 中Array.prototype.sort 函数的用法

来源:http://www.jb51.net/article/5769.htm

JavaScript中对变量的操作都是通过引用方式,而对数组也一样。 
前两天想要对一个数组进行复制,一直苦于找不到办法(遍历的方法俺是绝对不采用的) 

无意中拿起《JavaScript权威指南》翻了翻数组的操作函数,发现了slice()函数。 

slice()原来是用来截取数组中的一部分,这里我用它来复制数组,它的格式如下: 
array.slice(start, end) 
如果省略了end参数,则切分的数组包含从start开始到数组结束的所有元素。  

现在要用它来复制数组,就一行,呵呵: 
var newArray=oldArray.slice(0);  



所有这些功能,用一个sort()就可以完成了。 

1. 排序: 
默认的sort()按字符编码排序的:

<script type="text/javascript"> 
<!-- 
    var testArray=[3,324,5345,6546,134,5654,665]; 
    testArray.sort(); 
    alert(testArray); 
//--> 
</script>

 现在要让它按照数值大小排序:

<script type="text/javascript"> 
<!-- 
    var testArray=[3,324,5345,6546,134,5654,665]; 
    testArray.sort(function(a,b){return a-b;}); 
    alert(testArray); 
//--> 
</script>

 

只要传递一个比较函数给sort就可以了,如果比较函数的值小于0,则表示a必须出现在b前面,否则在b后面。

2. 乱序: 
让比较函数随机传回-1或1就可以了:

<script type="text/javascript"> 
<!-- 
    var testArray=[1,2,3,4,5,6,7,8,9,10,22,33,55,77,88,99]; 
    testArray.sort(function(){return Math.random()>0.5?-1:1;}); 
    alert(testArray); 
//--> 
</script>  

 3. 搜索: 
用sort()来玩搜索还蛮新鲜的,呵呵,看看是怎么玩的吧。 
我现在要把数组里含有字母'a'的元素全部找出来,如果没有sort(),似乎只能用遍历了,遍历的效率…那个叫恐怖啊!!具体做法如下:

<script type="text/javascript"> 
<!-- 
    var testArray=['df', 'rtr', 'wy', 'dafd', 'dfs', 'wefa', 'tyr', 'rty', 'rty', 'ryt', 'afds', 'wer', 'te']; 
    testArray.sort(function(a,b){return a.indexOf('a')==-1?1:-1;}); 
    alert(testArray); 
//--> 
</script>

 

这样就把数组中含有字母'a'的元素全部放到数组前面啦,再经过一些简单的处理,就可以输出搜索结果了。

用slice来拷贝数组的确是一个很好的方法,而且实际上用得也会比较多,不过效率和遍历相比很难说优劣,因为我们谁也不知道js的slice是怎么实现的,不过推测起来应该要高效一些,更重要的是写起来简单多了。 

第二个排序的方法确实很巧妙,这样就不用自己写洗牌算法了 ^^ 

至于第三个嘛...如果不用正则,一定要用Sort的话,一样是写起来简单很多,不过效率可能不见得比遍历高,要知道遍历并不意味着效率低,线性表单向搜索的遍历算法是O(N)复杂度的,Js的sort我猜用得是q-sort算法(如果用冒泡的话那就太寒酸了吧^^),所以起码是O(N*LogN)复杂度的(排序比搜索复杂也很容易理解),也就是说执行效率上用Sort匹配基本上肯定是要不如用直接的遍历来得快的。
数组拷贝我习惯用concat。如: newArr = oldArr.concat(),效率和slice(0)一样。 

我测试过,slice或concat拷贝数组要比遍历快得多。 
测试过程中我还发现另外一个特点,一个数组通过下标取值时,似乎也是通过类似遍历的的方法取值的。比方说数组arr有100万个数组元素,那么这两个表达式:i = arr[0] 和  i = arr[999999] 相比,前者会更快的取到值!(如果不信可以自己去编个相关例子试试看)。也就是说当遍历数组时,每次取值的所需时间会随着下标值的增加而增大。

posted on 2015-08-05 14:19  华安  阅读(228)  评论(0编辑  收藏  举报

导航