简述
JS在1.6中为Array新增了几个方法map(),filter(),some(),every(),forEach()
刚开始接触这些倒也记得不是很清楚,在此纪录一下以加深影响。我主要从两个角度来理解和记忆吧,一个是API的使用,一个是内部实现。
函数简述
forEach() 方法对数组的每一个元素执行一次提供的函数。
map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变。
filter() 方法使指定函数测试数组的每一个元素,并放回一个通过元素的新数组。
some():方法用于检测数组中的元素是否有满足指定条件的,若满足返回true,否则返回false
every():方法用于检测数组中所有元素是否都符合指定条件,若符合返回true,否则返回false;
API的区别
//数组操作之迭代器方法(这些方法可以对数组中的每一个元素运用某个方法)
//一、不生成新数组的迭代器方法
//1、forEach方法(接收一个函数作为参数)
function square(num){
alert(num * num) ;
}
var nums = [1,2,3,4,5];
console.log(nums.forEach(square));
//2、every方法(接收一个返回值为布尔值的函数,对数组中的每一个元素使用该函数)
function isEven (num) {
return num % 2==0;
}
var evens=[2,4,6,8,10];
var isAllEven = evens.every(isEven); //当且仅当数组中的所有的元素返回为真,every函数才会返回为真
if(isAllEven){
alert("all is even");
}else{
alert("not all is even");
}
//3、some方法(只要数组中有一个元素使用方法返回为真,some函数就会返回真)
var nums = [1,2,3,5,7,9];
function isEven (num) {
return num % 2==0;
}
alert(nums.some(isEven)); //true
//4.reduce方法
//用法一:为数组中的元素求和
function add (currentTotal,currentValue) {
//alert(currentValue);
//alert(currentTotal);
return currentTotal+currentValue;
}
var nums = [1,2,3,4,5,6,7];
alert(nums.reduce(add));
//用法二:将数组中的元素连接成一个长的字符串
function linkStr (foreStr,currentStr) {
return foreStr + currentStr;
}
var strings = ["nolan","is","studying","javascript"];
alert(strings.reduce(linkStr));
//二、生成新数组的迭代器方法
//1.map方法(类似于不生成新数组中的forEach方法)
//用法一:取数组中每个单词的第一个字母
function firstAlpha (word) {
return word[0].toUpperCase();
}
var words = ["nolan","is","studying","javascript"];
var firstAlphas = words.map(firstAlpha);
alert(firstAlphas.join("")); //使用join可以去掉连接数组元素的逗号
//2.filter方法(类似于every方法)
//用法一:筛选出符合条件(即返回值为true)的元素
function isEven (num) {
return num % 2==0;
}
var nums=[1,2,4,6,8,10];
var evens = nums.filter(isEven);
alert(evens);
//案例:随机生成一些成绩,挑选出大于六十分的成绩
function pass (grade) {
if(grade>60){
return true;
}else{
return false;
}
}
var grades = [];
for(var i=0;i<20;i++){
grades[i]=Math.floor(Math.random()*101);
}
alert(grades);
var passedGrades=grades.filter(pass);
alert(passedGrades);
https://blog.youkuaiyun.com/weixin_38578293/article/details/81353917
reduce() 的用法
重点总结: reduce()是数组的归并方法,与forEach()、map()、filter()等迭代方法一样都会对数组每一项进行遍历,但是reduce() 可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这一点是其他迭代方法无法企及的
arr.reduce(function(prev,cur,index,arr){
...
}, init);
其中,
arr 表示原数组;
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
init 表示初始值。
看上去是不是感觉很复杂?没关系,只是看起来而已,其实常用的参数只有两个:prev 和 cur。接下来我们跟着实例来看看具体用法吧~
- 求数组项之和
var sum = arr.reduce(function (prev, cur) {
return prev + cur;
},0);
由于传入了初始值0,所以开始时prev的值为0,cur的值为数组第一项3,相加之后返回值为3作为下一轮回调的prev值,然后再继续与下一个数组项相加,以此类推,直至完成所有数组项的和并返回。
- 求数组项最大值
var max = arr.reduce(function (prev, cur) {
return Math.max(prev,cur);
});
由于未传入初始值,所以开始时prev的值为数组第一项3,cur的值为数组第二项9,取两值最大值后继续进入下一轮回调。
- 数组去重
var newArr = arr.reduce(function (prev, cur) {
prev.indexOf(cur) === -1 && prev.push(cur);
return prev;
},[]);
1. reduceRight()
该方法用法与reduce()其实是相同的,只是遍历的顺序相反,它是从数组的最后一项开始,向前遍历到第一项。