来源: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()按字符编码排序的:

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

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

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

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

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

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

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

  1. <script type="text/javascript">
  2. <!--
  3. var testArray=['df', 'rtr', 'wy', 'dafd', 'dfs', 'wefa', 'tyr', 'rty', 'rty', 'ryt', 'afds', 'wer', 'te'];
  4. testArray.sort(function(a,b){return a.indexOf('a')==-1?1:-1;});
  5. alert(testArray);
  6. //-->
  7. </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 函数的用法的更多相关文章

  1. JavaScript中Array.prototype.sort()的详解

    摘抄来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sor ...

  2. Javascript 中 Array的 sort()和 compare()方法

    Javascript 中 Array的 sort()方法其实是把要排序的内容转化为string(调用 toString()), 然后按照字符串的第一位 ascii 码先后顺序进行比较,不是数字. 我们 ...

  3. javascript中 Array.prototype.slice的用法.

    首先看到 www.w3school.cn上的解释:http://www.w3school.com.cn/jsref/jsref_slice_array.asp 定义和用法 slice() 方法可从已有 ...

  4. Javascript中Array.prototype.map()详解

    map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...

  5. js中Array.prototype.push.call的用法

    var arr = [] Array.prototype.push.call(arr,"a","b","c") <==> []. ...

  6. JavaScript 中Array数组的几个内置函数

    本文章内容均参考<JavaScript高级程序设计第三版> 今天在看JavaScript书籍的时候,看到之前没有了解过的JavaScript中Array的几个内置函数对象,为了之后再开发工 ...

  7. JS中Array数组的三大属性用法

    原文:JS中Array数组的三大属性用法 Array数组主要有3大属性,它们分别是length属性.prototype属性和constructor属性. JS操作Array数组的方法及属性 本文总结了 ...

  8. Array.prototype.sort()对数组对象排序的方法

    Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行 ...

  9. 我可能不懂Array.prototype.sort

    今天 fix 我们后台系统的一些 bug.系统是基于 beego 和模板开发的,各种前后端代码揉作一团,没有格式,没有 eslint,全局变量满天飞,连 js 代码都有后端的插值,读起来非常 酸爽. ...

随机推荐

  1. 用tmux工具给linux命令行分栏

    介绍 有时候我们需要在命令行里同时开多个程序,但是每个程序都会占用命令行,这时候可以用tmux,给命令行界面分栏. 基本概念 tmux是分多层的 会话>窗口(我下文称作:页)>面板(或者叫 ...

  2. Android APP打包错误,Could not resolve com.android.tools.lint:lint-gradle:26.1.2.

    1.Please select the product flavors to build and sign 不专业的翻译一下(请选择产品的味道来制作和签名)什么鬼: 选中Flavors中的选项即可: ...

  3. windows下git的使用

    1.安装git 下载地址:https://git-scm.com/download/win

  4. this绑定丢失的问题

    在之前的一篇文章<this绑定>中已经说过this绑定的四种情况,也谈到了this绑定丢失的问题,但是没有解释为什么会出现this绑定的丢失,最近在多次阅读关于this绑定方面的文章之后, ...

  5. ASP.NET 实现重启系统或关机

    在C#程序中实现电脑的关机.重启,两种方法可以实现: 方法1:启动Shell进程,调用外部命令shutdown.exe来实现. 首先导入命名空间using System.Diagnostics;然后, ...

  6. 《算法》第六章部分程序 part 2

    ▶ 书中第六章部分程序,包括在加上自己补充的代码,B-树 ● B-树 package package01; import edu.princeton.cs.algs4.StdOut; public c ...

  7. 中国大学mooc直播回放看这里哦http://www.icourse163.org/forum/1001974001/topic-1003372881.htm?sortType=1&pageIndex=1

    中国大学mooc直播回放看这里哦http://www.icourse163.org/forum/1001974001/topic-1003372881.htm?sortType=1&pageI ...

  8. Callable和Future 多线程

    参考:https://www.cnblogs.com/fengsehng/p/6048609.html

  9. antd-mobile使用报错

    在第一次使用时,按照官网的进行配置,完了报错找不到antd-mobile下面的css 解决方法来源于 :https://github.com/ant-design/ant-design-mobile/ ...

  10. 图文详解AO打印(端桥模式)(转)

    一.概述   AO打印是英文Active-Online Print的简称,也称主动在线打印.打印前支持AO通讯协议的AO打印机首先通过普通网络与C-Lodop服务保持在线链接,网页程序利用JavaSc ...