JavaScript中的ilter()、forEach()、map()、reduce()、reduceRight()的区别

每个项目产品都要加埋点,加500行埋点是不是会占用你一两天的时间而且很容易犯错,想只用一小时准确加完这500行埋点剩下一天喝茶聊天么?来试试这520工具,高效加埋点,目前我们公司100号前端都在用,因为很好用,所以很自然普及开来了,推荐给大家吧

http://www.520webtool.com/

自己开发所以免费,埋点越多越能节约时间,点两下埋点就加上了,还不会犯错,里面有使用视频,反正免费 😄

map()函数用于对数组或对象进行处理,并返回处理之后的数组.

'use strict'//严格模式
 let arr = [1, 2, 3, 4];
  let newArr = arr.map(function(item) {  // 使用map方法
          return item * 2;
  });
  console.log(newArr);    // [2, 4, 6, 8]

filter()函数用于筛选出符合要求的数据,并返回该数据集合.

let arr = [1, 2, 3, 4];
  let newArr = arr.filter(function(item) {  // 使用filter方法
         if (item % 2 !== 0) {
             return item;
         } 
 });
 console.log(newArr);    // [1, 3];`

reduce()函数用于把数组或对象归结为一个值,并返回这个值,使用方法为arr.reduct(func,memo),其中func为处理函数,memo为初始值,初始值可缺省.

'use strict'
let arr = [1,2,3,4];
let newArr=arr.reduce(function(a,b){
        return a+b;
        }); 
console.log(newArr)  ; //10
--------------------- 
作者:懂懂kkw 
来源:CSDN 
原文:https://blog.csdn.net/jiandan1127/article/details/78644968 
版权声明:本文为博主原创文章,转载请附上博文链接!
 

 

一、简述
ECMAScript 5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象。 
传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响访问的返回值。以下是这5个迭代方法的作用。

every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回 true。
some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true ,则返回 true
filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
他们的参数都一样:

在每一项上运行的函数(该函数有三个参数) 
函数第一个参数:数组项的值
函数第二个参数:数组项的索引
函数第三个参数:数组对象本身
运行该函数的作用域对象——影响this的值(可选)
二、区别
filter()、forEach()、map()、some()、every()都是对数组的每一项调用函数进行处理。

区别: 
– some()、every()的返回值 :true / false 
– filter()、map()的返回值 :一个新数组 
– forEach()无返回值。
使用filter()、forEach()、map()、some()、every()都不改变原数组。

下面进入正题,用例子区分一下filter()、forEach()、map()间的区别:

filter()
var arr = [1,2,3,4];
var my = arr.filter(function(item,index,arr){
    return item*2 > 2; 
});
console.log(my);   //[2, 3, 4] //说明filter返回 true的项组成的数组
console.log(arr);  //[1, 2, 3, 4]

var arr = [1,2,3,4];
var my = arr.filter(function(item,index,arr){
    return item*2;
});
console.log(my);   //[1, 2, 3, 4]  //说因为每一项都为true
console.log(arr);  //[1, 2, 3, 4]

forEach()
var arr = [1,2,3,4];
var my = arr.forEach(function(item,index,arr){
    return item*2;
});
console.log(my);   //undefined    //说明forEach方法没有返回值
console.log(arr);  //[1, 2, 3, 4]

map()
var arr = [1,2,3,4];
var my = arr.map(function(item,index,arr){
    return item*2;
});
console.log(my);   //[2, 4, 6, 8]
console.log(arr);  //[1, 2, 3, 4]

三、forEach() 与 map()
细讲下forEach() 与 map()的区别: 
map()会分配内存空间存储新数组并返回,forEach()不会返回数据但可以改变原数组。

1、forEach() 
forEach适合于你并不打算改变数据的时候,而只是想用数据做一些事情 – 比如存入其他变量中 或 打印出来。

let arr = ['a', 'b', 'c', 'd'];
arr.forEach((letter) => {
 console.log(letter);
});
// a
// b
// c
// d

当然forEach也可以改变原数组:

var arr = [1,2,3,4,5];
arr.forEach((num, index) => {
   return arr[index] = num * 2;
});
console.log(arr)   //[2, 4, 6, 8, 10]

2、map() 
map()适用于你要改变数据值的时候,返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。

let arr = [1, 2, 3, 4, 5];
let arr2 = arr.map(num => num * 2).filter(num => num > 5);
console.log(arr2)  // [6, 8, 10]

四、reduce()、reduceRight()
数组还有两个归并方法:reduce()、reduceRight() 
reduce()方法从左到右遍历数组;而reduceRight()从右到左遍历数组;

reduce()、reduceRight()的参数一样:

第一个参数:在每一项调用的函数(该函数包含四个参数) 
函数第一个参数:前一项的值
函数第二个参数:当前项的值
函数第三个参数:项的索引
函数第四个参数:数组对象
第二个参数:作为归并的基础值(可选)

reduce()、reduceRight()的第一个参数是个函数,该函数返回的任何值都会作为第一个参数 自动传给下一项。为了归并,所以它们都是把数组的第一项和第二项作为第一次遍历。(也就是说:假如数组有n个元素,那它调用reduce()或reduceRight()后 就是遍历 n-1 次) 
如果不懂可以看下面例子。

例1:

var a = [1,2,3].reduce(function(prev,item,key,array){
    console.log(9);  //打印了 两次9
    return prev+item;
});
console.log(a);//6

输出:9 9 6

我们看看发生了什么,首先进行第一次归并:将数组的第一项与第二项相加(即1+2),将结果3作为函数的第一个参数传给下一项;然后进行第二次归并:用3+3,最终返回6。其间由于进行了两次归并,所以在输出6之前,会输出两次9.


那如果这个数组只有一项或是个空数组呢?我们往下看:

例2:

var a = [1].reduce(function(prev,item,key,array){
    console.log(2);  //不打印
    return prev+item;
});
console.log(a);//1
//如果归并的数组为空,则会报错

输出:1

没有打印2,直接输出1,说明reduce的函数压根没执行,直接将原数组返回了。 
如果这个数组是空的,调用reduce() 或 reduceRight()后会直接报错,所以我们在进行上面操作时最好判断下是否为空数组,不为空再做处理。
--------------------- 
作者:白小宇 
来源:CSDN 
原文:https://blog.csdn.net/b954960630/article/details/81432881 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值