`
我是一朵棉花云
  • 浏览: 9085 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

javascript理解数组和数字排序

    博客分类:
  • js
 
阅读更多
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"。验证数组类型的代码如下:
var is_array = function(value){ 
    return value && //有值 
        typeof value === "object" && //typeof查出类型为object 
        typeof value.length === "number" && //length属性是number类型 
        typeof value.splice === "function" && //有splice方法 
        !(value.propertyIsEnumerable("length"))//length是一个不可枚举的属性 

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

         while(len < n) {  
             num = "0" + num;  
             len++;  
         } 
         return num;  
    } 

    var tmpArray=[]; 
    for (var i=0;i<this.length;i+=1){ 
        tmpArray.push(lpad1(this[i],n)); 
    } 

    return tmpArray; 



//排序 
Array.prototype.nsort = function (n){ 
    var farray = [];//小于0一组 
    var zarray = [];//大于等于0一组 
    var tmp = []; //临时数组 
    var result = [];//返回值 

    for (var i=0;i<this.length;i+=1){ 
        if(this[i]<0){ 
            farray.push(Math.abs(this[i]));//负数取绝对值 
        }else{ 
            zarray.push(this[i]); 
        } 
    } 

    tmp = farray.lpad(n).sort(); 
    for(var i=0;i<tmp.length;i+=1){ 
        result.push(parseFloat(tmp[tmp.length-1-i])*-1);//负数组要反过来排序 
    } 

    tmp = zarray.lpad(n).sort(); 
    for(var i=0;i<tmp.length;i+=1){ 
        result.push(parseFloat(tmp[i])); 
    } 

    return result; 


myNumArray = [2,-80,-9.6,-9.4,-10,5.823,-13.888,20,312,3,2,55,-1,7.999,22]; 

iJs.pt("myNumArray"); 
iJs.pt("is_array(myNumArray)"); 
iJs.pt("myNumArray.sort()"); 
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 对象属性(http://www.w3school.com.cn/js/jsref_obj_array.asp)
FF: Firefox, IE: Internet Explorer
属性 描述 FF IE
constructor 返回对创建此对象的数组函数的引用。 1 4
index 1 4
input 1 4
length 设置或返回数组中元素的数目。 1 4
prototype 使您有能力向对象添加属性和方法。 1 4
Array 对象方法
FF: Firefox, IE: Internet Explorer
方法 描述 FF IE
concat() 连接两个或更多的数组,并返回结果。 1 4
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 4
pop() 删除并返回数组的最后一个元素 1 5.5
push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 5.5
reverse() 颠倒数组中元素的顺序。 1 4
shift() 删除并返回数组的第一个元素 1 5.5
slice() 从某个已有的数组返回选定的元素 1 4
sort() 对数组的元素进行排序 1 4
splice() 删除元素,并向数组添加新元素。 1 5.5
toSource() 返回该对象的源代码。 1 -
toString() 把数组转换为字符串,并返回结果。 1 4
toLocaleString() 把数组转换为本地数组,并返回结果。 1 4
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 6
valueOf() 返回数组对象的原始值 1 4
分享到:
评论

相关推荐

    冒泡排序算法实现javascript, python, go, java, php

    冒泡排序算法是一种简单直观的排序算法,主要通过比较相邻元素的值,依次交换位置,直到没有任何一对数字需要交换,从而完成排序。该算法得名于较小或较大的元素会像水中的气泡一样逐渐“浮”到数列的顶端或底端。...

    关于javascript sort()排序你可能忽略的一点理解

    下面这篇文章主要和大家分享了关于最近学习javascript sort()排序发现了一点理解,下面话不多说了,来一起看看详细的介绍吧。 sort()排序的原理 最近在leetcode刷题的时候遇到一个排序问题之前一直都忽略了sort排序...

    PHP和MySQL Web开发第4版pdf以及源码

    3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()...

    PHP和MySQL WEB开发(第4版)

    3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()函数 ...

    PHP和MySQL Web开发第4版

    3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()...

    JavaScript高级教程

    2.7.2 转换成数字..............................................19 2.7.3 强制类型转换..............................................20 2.8 引用类型..............................................22 2.8.1 ...

    最新Java面试宝典pdf版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java面试笔试资料大全

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java面试宝典2010版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 5、说明生活中遇到的二叉树,用java实现二叉树 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复...

    Java面试宝典-经典

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    JAVA面试宝典2010

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    java面试题大全(2012版)

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java面试宝典2012版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名...

    java面试宝典2012

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 72 5、说明生活中遇到的二叉树,用java实现二叉树 73 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java面试宝典2012新版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    bytewise-uri:字节键路径的URI编码方案

    易读性针对键中使用的最常见类型进行了优化-字符串,数字和顶级数组。 如果您通常坚持使用这些类型,则您的按键应该看起来相当优雅。 该库还将所有字节编码功能都嵌入到这些URI中,因此在阅读下面的示例时请牢记这...

    JAVA上百实例源码以及开源项目

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器...

Global site tag (gtag.js) - Google Analytics