珠峰培训

js中的数组排序及求平均数

作者:fandonglai

2016-08-07 22:19:53

287

1、求数组的最大值和最小值

求数组最大值和最小值的几种方法:

1.1 数组排序

现将数组排序,然后取第一个值和最后一个值

1.2 Math.min();Math.max();

  1. 这两个方法的参数不能接收数组

  2. 可以先把[12,1,41,5,2,4,6,3].join()/toString()数组转为字符串

  3. 然后使用eval()把一个字符串变为JS表达式执行

  4. 但是eval(“12,1,41,5,2,4,6,3”)只能获取到最后一项的值

可以先将想要的内容拼接为字符串,然后再执行

eval(“Math.max(“+arr.toString()+”)”);

eval(“Math.min(“+arr.toString()+”)”);

一个括号中出现多项表达式,中间以逗号隔开,但是只能获取到最后一项,此为括号表达式

括号表达式:(x1,x2,x3…)括号表达式中出现多项内容时,并以逗号隔开时,只能获取或执行最后一项

function f1(){
console.log(this);
}
function f2(){
console.log(this);
}
var obj = {name:"Amy",fn:f2}
;(f1,f2)(); //window
;(f1,obj.f2)(); //window
;(obj.f2)(); //obj
;(f2)(); //window

1. 3 假设法

假设数组第一个值为最大值,然后和后面的值逐个比较,遇到比假设值大的则替换,直到结束

var min = arr[0];
var max = arr[0];
for(var i=0;i<arr.length;i++){
var cur = arr[i];
cur>max ? max = cur : null;
cur<min ? min = cur : null;
}

假设法类似自定义属性,这都是编程中的常用思想

1.4 apply参数

var arr = [12,15,46,53,32,16,33];
var a = Math.max.apply(null,arr);

2、求平均数

  • 将数据以参数形式传入方法中,但是arguments为类数组,不能直接使用数组方法,需要将类数组转化为数组
  • 先将arguments转化为数组,或者借用数组原型上的slice方法,将this变为arguments,实现类数组转化为数组

两种方法的比较:

var arr = [];
for(var i=0;i<arguments.length;i++){
arr[arr.length] = arguments[i];
}
//模拟slice方法复制数组
Array.prototype.mySlice = function(){
var arr = [];
for(var i=0;i<this.length;i++){
arr[arr.length] = this[i];
}
return arr;
};

由此可以得出将slice方法中的this替换为arguments即可,得出

Array.prototype.slice.call(arguments);

类数组使用数组的方法,需要转化

function avg(){
Array.prototype.sort.call(arguments,function(a,b){return a-b;});
[].pop.call(arguments);
[].shift.call(arguments);
return (eval([].join.call(arguments,"+"))/arguments.length).toFixed(2);
};
var res = avg(1,4,2,6,3,6,8,7,4,9);
console.log(res);

Number.toFixed(2) 保留小数两位