`
pipi709
  • 浏览: 23515 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

    博客分类:
  • js
阅读更多

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] 相比,前者会更快的取到值!(如果不信可以自己去编个相关例子试试看)。也就是说当遍历数组时,每次取值的所需时间会随着下标值的增加而增大。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangw428/archive/2009/03/26/4027438.aspx

分享到:
评论

相关推荐

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

    前两天想要对一个数组进行复制,一直苦于找不到办法(遍历的方法俺是绝对不采用的) 无意中拿起《JavaScript权威指南》翻了翻数组的操作函数,发现了slice()函数。 slice()原来是用来截取数组中的一部分,这里我用...

    javaScript中slice函数用法实例分析

    javaScript 中的 slice 函数,对于array对象的slice函数,返回一个数组的一段。(仍为数组) arrayObj.slice(start, [end])  参数: arrayObj,必选项。一个 Array 对象。  start,必选项。arrayObj 中所指定的...

    JavaScript中数组slice和splice的对比小结

    今天重温了一下Javascript,看到了数组的方法,其中有两个比较相似的方法——splice和splice,看着很像,就是多了一个p,但是用法却相当不一样。 在使用中,可以通过选择一个具有强语义表达性的 API 来减少混淆的...

    PHP基于数组实现的分页函数实例

    关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页函数的操作及显示,需要...

    Golang中的Slice与数组及区别详解

    在golang中有数组和Slice两种数据结构,Slice是基于数组的实现,是长度动态不固定的数据结构,本质上是一个对数组字序列的引用,提供了对数组的轻量级访问。那么我们今天就给大家详细介绍下Golang中的Slice与数组, ...

    JavaScript数组操作函数汇总

    这里总结到的 js 数组操作函数有:push,pop,join,shift,unshift,slice,splice,concat (1)push 和 pop 这两个函数都是对数组从尾部进行压入或弹出操作。push(arg1,arg2,…)可以每次压入一个或多个元素,并...

    JavaScript 数组的深度复制解析

    对于javascript而言,数组是引用类型,如果要想复制一个数组就要动脑袋想想了,因为包括concat、slice在内的函数,都是浅层复制。也就是说,对于一个二维数组来说,用concat来做复制,第二维的数组还是引用,修改了...

    JavaScript使用slice函数获取数组部分元素的方法

    主要介绍了JavaScript使用slice函数获取数组部分元素的方法,涉及javascript中slice方法的使用技巧,非常具有实用价值,需要的朋友可以参考下

    Python高级特性——详解多维数组切片(Slice)

    今天小编就为大家分享一篇Python高级特性——详解多维数组切片(Slice),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    深入探密Javascript数组方法

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回’object’。 1. Array.prototype.slice方法 数组的 ...

    JS数组方法slice()用法实例分析

    主要介绍了JS数组方法slice()用法,结合实例形式分析了JavaScript数组slice()方法具体功能、用法及相关操作注意事项,需要的朋友可以参考下

    slice函数的用法 之不错的应用

    代码如下:slice函数的用法:slice(a, b) 截取 数组 a 到 b 之间的元素组成新数组 截取到的元素为 a, a+1, …, b-1 删除数组中元素a到元素b的方法是: 合并元素a之前的元素与元素b起的元素; function...

    JavaScript类数组对象转换为数组对象的方法实例分析

    本文实例分析了JavaScript类数组对象转换为数组对象的方法。分享给大家供大家参考,具体如下: 1、类数组对象: 拥有length属性,可以通过下标访问; 不具有数组所具有的方法。 2、为什么要将类数组对象转换为数组...

    javascript中不易分清的slice,splice和split三个函数_.docx

    javascript中不易分清的slice,splice和split三个函数_.docx

Global site tag (gtag.js) - Google Analytics