对一个数组 filter、some、map、foreach的操作分别有什么作用?

1.背景介绍
使用JavaScript数组常常需要对数组进行遍历、迭代操作。而我们常用的就是for语句对数组进行迭代。 
然而在ECMAscript5已经为数组定义了5个迭代的方法,分别是:filter、some、map、foreach、every,下面我们讲讲它们的具体作用。

2.知识剖析
五个迭代方法,每个方法都接收两个参数:要在每一项上运行的函数和运行该函数的作用域对象(可选的)。 
传入这些方法中的函数会接收三个参数:数组的项的值、该项在数组中的位置和数组对象本身。

① filter()是对数组中的每一项运行给定函数,返回该函数会返回true的项所组成的数组。

② map()是对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。 

③ forEach() 是多数组中的每一项运行给定函数,这个方法没有返回值。它只是对数组中的每一项运行传入的函数,没有返回值。本质
上与使用for循环迭代数组一样。 

④ every()是对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
⑤ some()是对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。 

3.常见问题
迭代和遍历、循环、递归有什么区别?

4.解决方案
① 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。 
循环能对应集合,列表,数组等,也能对执行代码进行操作。 

② 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。 
迭代只能对应集合,列表,数组等。不能对执行代码进行迭代。 

③ 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。 
遍历同迭代一样,也不能对执行代码进行遍历。 

④ 递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。 
线性递归和尾递归。


5.编码实战


 var arr = [1, 2, 3, 4, 5];//这个不注释,后面都要用


    // filter
    // var filterResault = arr.filter(function (item, index, array) {
    //     return (item > 2); 
    // });
    // console.log("filter:",filterResault);

    // //如果用for循环
    // var arr2 = [];
    // for (i = 0; i < arr.length; i++) {
    //     if (arr[i] > 2) {         
    //         arr2.push(arr[i]);
    //     };
    // };
    // console.log("for循环:",arr2);

    // // //map
    // var mapResault = arr.map(function (item, index, array) {
    //     // return item * 2;
    //     return (item > 2);
    // });
    // console.log(mapResault);

    // // //forEach
    // var arr2 = [];
    //     arr3 = [];
    // var forResault = arr.forEach(function (item, index, array) {
    //     arr2[index] = item * 2;
    // });
    // console.log("arr2: ",arr2);
    // console.log("forResault: ",forResault);//没有返回值

    // // //for循环方法
    // for (var i=0;i<arr.length;i++){
    //     arr3[i] = arr[i]*2;
    // };
    // console.log("arr3: ",arr3);

    //every
    // var everyResault = arr.every(function (item, index, array) {
    //     return (item > 2);
    // });
    // console.log("every: ",everyResault);


    // //some
    // var someResault = arr.some(function (item, index, array) {
    //     return (item > 2);
    // });
    // console.log("some: ",someResault);

    //扩展思考
    //reduce
    // reduceResult = arr.reduce(function(item,next,index,array){
    //     console.log("reduce:next",next);
    //     return item+next; 
    // });
    // console.log("reduceResult: ",reduceResult);

    // // //reduceRight
    // reduceRightResult = arr.reduceRight(function(item,next,index,array){
    //     console.log("reduceRight:next",next);
    //     return item+next; 
    // });
    // console.log("reduceRightResult: ",reduceResult);

6.扩展思考
ES5中两种归并方法 
① reduce()可以实现一个累加器的功能,将数组的每个值(从左到右)将其降低到一个值。 


② reduceRight()与reduce()功能一样,reduce是从数组的逐个遍历 到最后。而reduceRight()则从数组的最后一项开始,向前遍历到第一项。 

7.参考文献
迭代,循环,遍历,递归的区别:https://www.cnblogs.com/feichengwulai/articles/3642107.html
使用迭代方法替代for循环:https://segmentfault.com/a/1190000009870199

8.更多讨论

问题一:forEach()  这个方法 跟for循环有什么相同的地方,有什么不同的地方?
答:foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版。
再说一下foreach的书写格式:

     for(元素类型  元素名称 : 遍历数组(集合)(或者能进行迭代的)){
      语句
     }
  foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。
问题二:every()和some()这两个方法区别在哪里?
答:every()与some()方法都是JS中数组的迭代方法。every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。
问题三:参数item、index和array代表的是什么?
答:传入这些方法中的函数会接收三个参数,item表示遍历后的当前对象,里面的index代表当前循环到第几个索引,array代表数组对象本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值