作家
登录

JavaScript数组的快速克隆(slice()函数)和数组的排序、乱序和搜索(sort()函数)

作者: 来源:www.28hudong.com 2013-03-30 03:51:07 阅读 我要评论

JavaScript中对变量的操作都是通过引用方式,而对数组也一样。 前两天想要对一个数组进行复制,一直苦于找不到办法(遍历的方法俺是绝对不采用的) 无意中拿起《JavaScript权威指南》翻了翻数组的操作函数,发现了slice()函数。 slice()原来是用来截取数组中的一部分,这里我用它来复制数组,它的格式如下: array.slice(start, end) 如果省略了end参数,则切分的数组包含从start开始到数组结束的所有元素。 现在要用它来复制数组,就一行,呵呵: var newArray=oldArray.slice(0); 所有这些功能,用一个sort()就可以完成了。 1. 排序: 默认的sort()按字符编码排序的: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]现在要让它按照数值大小排序: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]只要传递一个比较函数给sort就可以了,如果比较函数的值小于0,则表示a必须出现在b前面,否则在b后面。2. 乱序: 让比较函数随机传回-1或1就可以了: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]3. 搜索: 用sort()来玩搜索还蛮新鲜的,呵呵,看看是怎么玩的吧。 我现在要把数组里含有字母'a'的元素全部找出来,如果没有sort(),似乎只能用遍历了,遍历的效率…那个叫恐怖啊!!具体做法如下: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]这样就把数组中含有字母'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] 相比,前者会更快的取到值!(如果不信可以自己去编个相关例子试试看)。也就是说当遍历数组时,每次取值的所需时间会随着下标值的增加而增大。

  推荐阅读

  如何实现表格中行点击时的渐扩效果!

曾经在一个flash RIA站点上看到这种效果,视觉效果真不错。flash开发者大概也以此来表明,flash做的应用程序,在动态效果上要优于js(个人观点)。后来我在做bmail的时候,用gif动画作为背景,基本实现了这一功能,>>>详细阅读


本文标题:JavaScript数组的快速克隆(slice()函数)和数组的排序、乱序和搜索(sort()函数)

地址:http://www.17bianji.com/kaifa2/JS/31162.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)