博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript理解数组和数字排序
阅读量:6673 次
发布时间:2019-06-25

本文共 2833 字,大约阅读时间需要 9 分钟。

javascript数组分配内存是非线性的,这样会牺牲性能,好处就是更加灵活,例如:数组元素不要求同样的类型,给数组添加元素不会越界。

数组下标从0开始,length取值为最大下标加1。数组下标不必连续,你也可以改变length的值,数组元素内存是动态分配的,仅仅是设置更大的length不会占用更多的空间,而将length的值改小,则大于等于该下标的元素会被清除掉,内存得以释放。

数组和对象的主要差别有两点,一是数组对象属性名称不能自定义,二是数组对象会有一些处理数组的方法,在对象中没有。

使用push函数添加元素语法比赋值更简洁,例如words.push("go")会添加一个元素"go"到words数组的尾部,length自动加一。

使用delete函数删除一个数组元素,例如delete words[2]将删除第3个元素。如果删除的不是最后一个数组元素,会导致数组下标不连续。splice方法会产生连续的结果,使用举例:words.splice[3,2],从序号为3的元素开始删,删2个元素,剩下的元素往前挪2个位置(要当心数组元素特别多时会有性能问题)。

通过for in语句遍历数组不能保证顺序,还可能从原型链中得到意外的属性。一般应通过for(var i = 0;i<myArray.length;i+=1){ do somthing...}这样的语句来枚举数组。

使用数组还是使用对象主要是取决于应用需求的属性名是不是整数。javascript不能用typeof区分数组和对象,二者返回的都是"object"。验证数组类型的代码如下:

 
  1. var is_array = function(value){  
  2.     return value && //有值  
  3.         typeof value === "object" && //typeof查出类型为object  
  4.         typeof value.length === "number" && //length属性是number类型  
  5.         typeof value.splice === "function" && //有splice方法  
  6.         !(value.propertyIsEnumerable("length"))//length是一个不可枚举的属性  
  7. }  

因为数组的排序方法(sort)是按字符串比较的,所以对数字进行排序的结果通常不符合预期。多数人会想着自己去重写数字的排序,我觉得对数字进行排序比较好的做法是在数字前补零,排完序后再把零拿掉。这一方法绕过了构思排序算法的困难,并且还能突破数字长度的限制,对大数进行排序,发挥内置算法的性能。

 
  1. //数字补零,正整数对齐  
  2. Array.prototype.lpad = function (n){  
  3.     var lpad1 = function (num, n) {   
  4.          var len = Math.floor(num).toString().length;   
  5.  
  6.          while(len < n) {   
  7.              num = "0" + num;   
  8.              len++;   
  9.          }  
  10.          return num;   
  11.     }  
  12.  
  13.     var tmpArray=[];  
  14.     for (var i=0;i<this.length;i+=1){  
  15.         tmpArray.push(lpad1(this[i],n));  
  16.     }  
  17.  
  18.     return tmpArray;  
  19. }  
  20.  
  21.  
  22. //排序  
  23. Array.prototype.nsort = function (n){  
  24.     var farray = [];//小于0一组  
  25.     var zarray = [];//大于等于0一组  
  26.     var tmp = []; //临时数组  
  27.     var result = [];//返回值  
  28.  
  29.     for (var i=0;i<this.length;i+=1){  
  30.         if(this[i]<0){  
  31.             farray.push(Math.abs(this[i]));//负数取绝对值  
  32.         }else{  
  33.             zarray.push(this[i]);  
  34.         }  
  35.     }  
  36.  
  37.     tmp = farray.lpad(n).sort();  
  38.     for(var i=0;i<tmp.length;i+=1){  
  39.         result.push(parseFloat(tmp[tmp.length-1-i])*-1);//负数组要反过来排序  
  40.     }  
  41.  
  42.     tmp = zarray.lpad(n).sort();  
  43.     for(var i=0;i<tmp.length;i+=1){  
  44.         result.push(parseFloat(tmp[i]));  
  45.     }  
  46.  
  47.     return result;  
  48. }  
  49.  
  50. myNumArray = [2,-80,-9.6,-9.4,-10,5.823,-13.888,20,312,3,2,55,-1,7.999,22];  
  51.  
  52. iJs.pt("myNumArray");  
  53. iJs.pt("is_array(myNumArray)");  
  54. iJs.pt("myNumArray.sort()");  
  55. iJs.pt("myNumArray.nsort(100)"); 
调试信息:
    myNumArray   
2,-80,-9.6,-9.4,-10,5.823,-13.888,20,312,3,2,55,-1,7.999,22
    is_array(myNumArray)   
true
    myNumArray.sort()   
-1,-10,-13.888,-80,-9.4,-9.6,2,2,20,22,3,312,5.823,55,7.999
    myNumArray.nsort(100)   
-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,7.999,20,22,55,312

 

Array 对象属性()

FF: Firefox, IE: Internet Explorer

属性 描述 FF IE
返回对创建此对象的数组函数的引用。 1 4
index   1 4
input   1 4
设置或返回数组中元素的数目。 1 4
使您有能力向对象添加属性和方法。 1 4

Array 对象方法

FF: Firefox, IE: Internet Explorer

方法 描述 FF IE
连接两个或更多的数组,并返回结果。 1 4
把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 4
删除并返回数组的最后一个元素 1 5.5
向数组的末尾添加一个或更多元素,并返回新的长度。 1 5.5
颠倒数组中元素的顺序。 1 4
删除并返回数组的第一个元素 1 5.5
从某个已有的数组返回选定的元素 1 4
对数组的元素进行排序 1 4
删除元素,并向数组添加新元素。 1 5.5
返回该对象的源代码。 1 -
把数组转换为字符串,并返回结果。 1 4
把数组转换为本地数组,并返回结果。 1 4
向数组的开头添加一个或更多元素,并返回新的长度。 1 6
返回数组对象的原始值 1 4

 

转载地址:http://csrxo.baihongyu.com/

你可能感兴趣的文章
报告显示:被调研中国企业超85%已从数字转型中获得回报
查看>>
东方日升拉美光伏电站项目 将进入首期施工
查看>>
软件探索性测试 笔记二
查看>>
将来也不会被破译的分布式存储系统
查看>>
光伏电站或成辅助服务市场“输家”
查看>>
今年光伏“领跑者”计划将升级扩围
查看>>
Java程序运行超时后退出或进行其他操作的实现
查看>>
手把手教你启用RemoteFX以及Hyper-V GPU卸载
查看>>
《交互式程序设计 第2版》一3.10 更进一步
查看>>
英伟达发布Tesla P4&P40两款基于Pascal架构的深度学习芯片
查看>>
《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
查看>>
《代码整洁之道:程序员的职业素养》一一1.3 首先,不行损害之事
查看>>
intellij 创建java web项目(maven管理的SSH)
查看>>
spring-java项目中连接redis数据库
查看>>
UML介绍--用例图
查看>>
阿里云DTS VS MySQLdump
查看>>
为android封装的百度定位组件
查看>>
我的友情链接
查看>>
Linux系统新手学习的11点建议
查看>>
Android SDK:构建一个购物中心搜索的应用(二)-Points of Interest
查看>>