当前位置: 首页 > 科技观察

助你掌握JS:函数式数组8例forEach

时间:2023-03-18 12:11:36 科技观察

JavaScript是当今流行语言中对函数式编程支持最好的编程语言。我们继续构建函数式编程的基础。在上一篇文章中,我们分解介绍了四种帮助我们整理思路的方法,分别是:-array.reduce方法助你掌握JS:神奇的array.reduce方法10例-数组。map方法助你掌握JS:神奇的array.map-array.flat方法6例,array.flatMap助你掌握JS:array.flat和flatMap使用指南以上四种方法的共同点是对数组转换和转换,所有这些都不会陷入琐碎的循环实现细节的肮脏细节中。接下来,我们将学习更通用的函数迭代方法array.forEach()。一句话概括了forEach和map的区别,pure-function用map,impure-function用forEach。array.forEach()语法概述forEach()方法对数组的每个元素执行一次给定的函数。constarray1=['a','b','c'];array1.forEach(element=>console.log(element));//预期输出:“a”//预期输出:“b”//预期输出:"c"参数回调是为数组中的每个元素执行的函数,它接收一到三个参数:-currentValue数组中正在处理的当前元素。-index可选正在处理的数组中当前元素的索引。-array可选forEach()方法正在操作的数组。thisArg可选可选参数。在执行回调函数callback时用作this的值。返回值未定义。array.forEach()描述forEach()方法对数组中包含升序有效值的每个项目执行一次回调函数,那些被删除或未初始化的项目将被跳过(例如在稀疏数组上)。可以依次向回调函数传递三个参数:数组中当前项的值当前项在数组中的索引数组对象本身如果thisArg参数有值,则每次this都会指向thisArg参数调用回调函数的时间。如果省略thisArg参数,或者它的值为null或undefined,则this指的是全局对象。按照函数观察this的通常规则,回调函数最终观察到this值。forEach()遍历的范围是在第一次调用回调之前确定的。调用forEach后添加到数组的项目将不会被回调访问。如果已经存在的值被更改,则传递给回调的值是forEach()遍历到它们时的值。不遍历删除的项目。如果访问的元素在迭代时被移除(例如使用shift()),后续元素将被跳过-请参见下面的示例。forEach()为每个数组元素执行一次回调函数;与map()或reduce()不同,它始终返回未定义且无法链接。它的典型用例是在调用链的末端执行副作用(副作用,在函数式编程中,是指执行除返回结果值之外的操作的函数)。调用forEach()时,它不会改变原始数组,即调用它的数组(尽管回调函数在调用时可能会改变原始数组)。(这里说的可能不够清楚,具体可以参考EMCA语言规范:'forEach不直接改变调用它的对象,而是通过调用回调函数改变对象',即是,forEach不会直接改变调用它的对象,但该对象可能会被回调函数更改。)注意:除了抛出异常之外,没有办法中止或退出forEach()循环。如果您需要中止或跳出循环,则不能使用forEach()方法。如果你需要提前终止循环,你可以使用:一个简单的for循环for...of/for...inloopArray.prototype.findIndex()这些数组方法可以判断数组元素,判断是否继续遍历:every()some()find()findIndex()只要条件允许,也可以使用filter()过滤掉需要提前遍历的部分,然后用forEach()处理。案例01对未初始化的值不做任何操作(稀疏数组)正如您所看到的,3到7之间的空数组单元格不会被forEach()回调函数或任何其他操作调用。constarraySparse=[1,3,,7];letnumCallbackRuns=0;arraySparse.forEach(function(element){console.log(element);numCallbackRuns++;});console.log("numCallbackRuns:",numCallbackRuns);//1//3//7//numCallbackRuns:3Case02将for循环转换为forEachconstitems=['item1','item2','item3'];constcopy=[];//beforefor(leti=0;i{if(Array.isArray(i))result.push(...flatten(i));elsresult.push(i);})returnresult;}//Usageconstproblem=[1,2,3,[4,5,[6,7],8,9]];flatten(problem);//[1,2,3,4,5,6,7,8,9]Case08使用promise或async函数的备注如果使用promise或async函数如forEach(),等类似方法的回调参数,最好多考虑对执行顺序的影响,否则容易出错。letratings=[5,4,5];letsum=0;letsumFunction=asyncfunction(a,b){returna+b;}ratings.forEach(asyncfunction(rating){sum=awaitsumFunction(sum,rating);})控制台。log(sum);//Expectedoutput:14//Actualoutput:0【编辑推荐】酷酷的,老板让我开发一个简单的工作流引擎……Windows10将迎来翻天覆地的变化!今年的第一次更新就在这里。2021年将迎来六大网络安全趋势。Windows10近年最大改进!先看Windows1021H2新特性小爱同学居然推出了PC版?带你体验电脑版小爱同学