javascript理解数组和数字排序

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值