数组Array方法之filter、map、sort、reduce
filter()(原数组未改变)
filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。
和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
例如,在一个Array中,删掉偶数,只保留奇数,可以这么写:
var arr1 = [1,2,4,5,6,9,10,15];
var r = arr1.filter(function(x) {
return x % 2 !== 0;
});
console.log(arr1,r); //[1, 2, 4, 5, 6, 9, 10, 15] [1, 5, 9, 15]
map()(原数组未改变)
返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
var numbers = [4, 9, 16, 25];
var c1=numbers.map(Math.sqrt);
console.log(numbers,c1);//[4, 9, 16, 25] [2, 3, 4, 5]
sort() (原数组改变)
排序算法:
Array的sort()方法就是用于排序的。但是排序结果可能让你大吃一惊。
如果调用该方法时没有使用参数,Array的sort()方法默认把所有元素先转换为String再按照字符编码的顺序进行排序,结果‘10’排在了‘2’的前面,因为字符‘1’比字符‘2’的ASCII码小。
例子
<script type="text/javascript">
var arr = [10,5,40,25,1000,1]
var arr1 = arr.sort()
console.log(arr)//1,10,1000,25,40,5
console.log(arr1)//1,10,1000,25,40,5
</script>
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。通常规定,对于两个元素x和y,如果认为x<y,则返回-1,如果x==y,则返回0,如果认为x>y,则返回1
升序 降序
var arr=[10,20,1,2]; var arr=[10,20,1,2];
arr.sort(function(x,y){ arr.sort(function(x,y){
x>y?1:-1 x<y?1:-1
});//[1,2,10,20] });//[1,2,10,20]
reduce()
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
[x1,x2,x3,x4].reduce(f) = f(f(f(x1,x2),x3),x4)
比如说对一个Array求和,就可以用reduce实现:
var arr = [1,3,5,7,9];
arr.reduce(function(x,y){
return x+y;
});//25
要把[1,3,5,7,9]变换成整数13579,reduce()也能派上用场:
var arr = [1,3,5,7,9];
arr.reduce(function(x,y) { return x*10+y;
});//13579