一、es5的数组方法概述
在ES5中定了9个新的数组方法来遍历、映射、过滤、检测、简化和搜索数组。
大所属数组的方法的第一个参数接收一个函数,并且对数组的每个元素(或一些元素)调用一次该函数。如果是洗漱数组,对不存在的元素不调用传递的函数。在大多数情况下,调用提供的函数使用三个参数:数组元素、元素的索引和数组本身。通常,只需要第一个参数值。
大多数情况下,这些数组方法的第一个参数是一个函数,第二个参数是可选的。如果有第二个参数,则调用的函数被看做是第二个参数的方法,也就是说,在调用函数时传递进去的第二个参数作为它的this关键字的值来使用。
es5中的数组方法都不会修改它们调用的原始数组,当然,传递给这些方法的函数是可以修改这些数组的。(截取自《Javascript权威指南 第6版》)
二、ES5中的5中数组方法
1.map()
map()方法对于数组的每一个元素进行一个函数的运行,可以经过函数执行完毕后,把新的结果返回。
var arr = [1,2,3,4,5];
arr.map(function(x) {
return x * x;
});
//[1,4,9,16,25]
也可以直接传入一个函数名,或者一个数据类型
arr.map(String); //将数组元素转化为字符串
//['1','2','3','4','5']
传递给map()的函数应该有返回值,map()方法将调用的数组的每个元素传递给指定的函数,并返回一个新数组(不修改原数组)
2.reduce()
使用指定的函数将数组元素及逆行组合,生成单个值。
reduce()方法需要两个参数:
第一个是必选参数,是一个执行化简操作的函数,这个函数必须接收两个参数。
化简参数的任务是用某种方法,把两个值组合或简化为一个值,并返回简化后的值。resuce()把结果就和序列的下一个元素做累积计算:
[x1,x2,x3].reduce(f) = f(f(x1,x2),x3);
第二个参数是可选参数,是一个传递给函数的初始值。当不指定函数的初始值时,它默认使用数组的第一个元素作为其初始值。
但在空数组上,不带初始值参数调用reduce()方法将导致类型异常。如果调用它的时候只有一个值(数组只有一个元素,并且没有指定初始值;或者是一个空数组,但指定了一个初始值),此时reduce()只是简单的返回那个值,不会去调用简化函数。
用reduce()求数组元素之积:
function sum(arr) {
return arr.reduce(function(x,y) {
return x * y;
});
}
sum([1,2,3,4,5]); //120
3.filter()
filter()用于把Array中某些元素过滤掉,然后返回剩下的元素。返回的数组元素是调用的数组的一个子集。
filter()把传入的函数依次作用于每个元素,传递的函数是用来做逻辑判定的,根据返回值是true还是false来决定保留还是丢弃该元素。
var arr = [1,2,3,4,5];
arr.filter(function(x) {
return x > 3;
});
//[4,5]
filter()方法会跳过洗漱数组中缺少的元素,它的返回数组总是稠密的。为了压缩稀疏数组中的空缺或者删除undefined和null元素,可以使用filter()来实现。
var arr = [1,2,3,'',4,null,5];
arr.filter(function() {
return true;
});
arr.filter(function(x) {
return x !== undefined && x !== null;
});
4。forEach()
forEach()方法从头至尾遍历整个数组,为每个元素调用指定的函数。和reduce()一样,调用的函数有三个参数:数组元素,元素的索引,数组本身。一般只需要第一个参数。
var arr = [1,2,3,4,5];
arr.forEach(function(value,index,arr) {
arr[index] = value + 5;
});
//[6,7,8,9,10]
但是forEach()方法无法再所有冤死都执行调用函数前终止遍历,即不能直接使用break,如果需要提前终止,必须把forEach()方法放在一个try快中,并抛出一个异常。
5.some()
在for()循环中,我们可以使用break来提前结束循环,但我们不能用for循环直接获取数组中的某个元素。一个快速的获取数组元素的方式是使用forEach()方法,但是这样我们就是去了break的能力。这种情况下,最接近的方法就是使用return来实现continue的功能
[1,2,3,4,5].forEach(function(val,index) {
if(val === 2) {
return true; //停止遍历
}
console.log(val);
});
更好的方式是使用some()来结束循环。
some()方法用来检测某些元素是否满足所提供的函数,如果有任何一个数组元素调用函数的返回值为true,则返回该方法就true,并停止运行,不再继续遍历数组。
var isTrue = function(num) {
return num > 5;
}
[1,2,3].some(isTrue); //false
[4,5,6].some(isTrue); //true
用return实现break的效果
[1,2,3,4,5].some(function(val,index) {
if(val === 2) {
return true; //break;
}
console.log(val); //1 true
});
也可以使用false来使循环continue到下一个元素。当返回true时。循环将会break,此时,some()将返回true
5.every()
every()和some()差不多,差别是,只有当数组的所有元素都返回true时,才会返回true。
[1,2,3,4,5].every(function(x) {
reutrn x > 2; //false
});