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] 相比,前者会更快的取到值!(如果不信可以自己去编个相关例子试试看)。也就是说当遍历数组时,每次取值的所需时间会随着下标值的增加而增大。
javascript 中Array.prototype.sort 函数的用法的更多相关文章
- JavaScript中Array.prototype.sort()的详解
摘抄来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sor ...
- Javascript 中 Array的 sort()和 compare()方法
Javascript 中 Array的 sort()方法其实是把要排序的内容转化为string(调用 toString()), 然后按照字符串的第一位 ascii 码先后顺序进行比较,不是数字. 我们 ...
- javascript中 Array.prototype.slice的用法.
首先看到 www.w3school.cn上的解释:http://www.w3school.com.cn/jsref/jsref_slice_array.asp 定义和用法 slice() 方法可从已有 ...
- Javascript中Array.prototype.map()详解
map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...
- js中Array.prototype.push.call的用法
var arr = [] Array.prototype.push.call(arr,"a","b","c") <==> []. ...
- JavaScript 中Array数组的几个内置函数
本文章内容均参考<JavaScript高级程序设计第三版> 今天在看JavaScript书籍的时候,看到之前没有了解过的JavaScript中Array的几个内置函数对象,为了之后再开发工 ...
- JS中Array数组的三大属性用法
原文:JS中Array数组的三大属性用法 Array数组主要有3大属性,它们分别是length属性.prototype属性和constructor属性. JS操作Array数组的方法及属性 本文总结了 ...
- Array.prototype.sort()对数组对象排序的方法
Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行 ...
- 我可能不懂Array.prototype.sort
今天 fix 我们后台系统的一些 bug.系统是基于 beego 和模板开发的,各种前后端代码揉作一团,没有格式,没有 eslint,全局变量满天飞,连 js 代码都有后端的插值,读起来非常 酸爽. ...
随机推荐
- 光伏电池测控系统python代码
'''硬件keithley万用表和程控电源visa是VXIplug&play系统联盟制定的一套标准.python实现VISA,形成pyviva模块'''###IV测试系统的部分程序代码 fro ...
- FastDFS+Nginx+fastdfs-nginx-module集群搭建
一.实验环境说明 操作系统: Centos 6.6 x64 FastDFS 相关版本: fastdfs-5.05 fastdfs-nginx-module-v1.16 libfastcommon-v1 ...
- Heartbeat+DRBD+MFS高可用
Heartbeat+DRBD+MFS高可用. 前言:MFS系统简介 组件名称及作用 管理服务器(Managing Server) 简称Master Server 这个组件的角色是管理整个mfs文件 ...
- 【sql小坑】在group by里用select字段的别名?
背景 -- 求每个用户的拥有的产品数,其中userid需要简单split出来 SELECT split (id, '-') [ 0 ] AS userid, count(DISTINCT produc ...
- HPUX and AIX SSH 互信
HPUX side: su - orasid check file AIX side: su - sidadm double check
- 代码: CSS3动画,简单示例(鼠标移上去后,背景图片旋转)
<script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.2/jquery.mi ...
- taotao商城
(1)写Dao层(大概是sqlMapConfig.xml,application-dao.xml,mapper), 配置顺序和内容,看下图:
- jmap dump文件压缩后失效
最近线上出问题,于是用jmap -dump拿到dump文件,再linux压缩后拿到windows下无效,后来又直接拿了一个没有压缩的竟然可以用...坑啊!~
- Spring.net介绍及MVC中应用
Spring.net两大核心内容: IOC(控制反转) 传统的面相对象思维模式是对象A依赖对象B,对象B的实例化和调用都在对象A中发生,一旦对象B中发生变化,对象A也要随之变化,这样使得程序间行程了紧 ...
- Valgrind简单用法 (转)
转自 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian Seward刚获得了今年的G ...